Rspec-mocks не вызывает исключения - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть этот фрагмент кода 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

Тест возвращает true . Кажется, исключение не сработало.

Есть идеи, что происходит?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

На самом деле проблема была при инициализации объекта 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

`` `

0 голосов
/ 07 сентября 2018

Вам нужно использовать блок при проверке исключений.

expect { added }.to raise_error(Gitlab::Error::BadRequest)

Попробуйте обновить код в соответствии с вашими потребностями.

Более подробную информацию можно найти здесь: https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/raise-error-matcher

...