У меня есть этот фрагмент кода RoR, который создает репозиторий gitlab. Если репозиторий уже существует, метод возвращает false с сообщением об ошибке.
class CreateRepositoryJob < ApplicationJob
queue_as :default
def perform(id)
namespace = Gitlab.create_group("applications", "applications")
begin
repo = Gitlab.create_project(id, namespace_id: namespace.id).to_hash.symbolize_keys
[true, repo]
rescue Gitlab::Error::BadRequest => e
[false, e]
end
end
end
`` ''
Я хотел бы протестировать этот метод, в частности, когда репозиторий уже существует. Я использую rspec-mocks, и вот что у меня есть:
it "cannot be created because the repository already exists" do
# some mocks...
allow(Gitlab).to receive(:create_project).with(anything).and_raise(Gitlab::Error::BadRequest)
added, repo = CreateRepositoryJob.perform_now entity, entity_directory
expect(added).to be false
end
Тест возвращает истинный. Похоже, что исключение не сработало.
Есть идеи, что происходит?





Вам нужно использовать блок при проверке исключений.
expect { added }.to raise_error(Gitlab::Error::BadRequest)
Попробуйте обновить код в соответствии с вашими потребностями.
Более подробную информацию можно найти здесь: https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/raise-error-matcher
Я знаю, проблема в том, что я не могу имитировать функцию, которая вызовет исключение.
Фактически, проблема была в инициализация объекта Gitlab :: Error :: BadRequest.
it "raise an exception for the second repository" do
# some mocks...
allow(Gitlab).to receive(:create_project).with(anything, anything).and_raise(Gitlab::Error::BadRequest.new(double(parsed_response: "error", code: 404, request: request)))
added, _ = CreateRepositoryJob.perform_now entity, entity_directory
expect(added).to be false
end
`` ''
что произойдет, если вы замените
allow(GitLab)наexpect(GitLab)?