Как проверить, был ли вызван внутренний метод с использованием RSpec - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть метод для обновления человека по идентификатору:

def update_person(id)
  handle_exceptions do
     person = Person.find(id)
     #...other
  end
end

Когда этого идентификатора не существует, должно вызываться исключение handle_exception. Но как я мог это проверить? Тест, который я написал:

context 'not found the proposals' do
  subject {controller.send(:update_person, 3)}

  before do
    allow(Person).to receive(:find).and_raise(ActiveRecord::RecordNotFound)
    allow(subject).to receive(:handle_exceptions)
  end

  it 'calls handle_exceptions' do
    expect(subject).to have_received(:handle_exceptions)
  end
end

Но он не работает, я получил сообщение об ошибке: Ошибка / ошибка: ожидаемо (субъект). handle_exceptions метод

def handle_exceptions
  yield
rescue ActiveRecord::RecordNotFound => e
  flash[:warning] = 'no record found'
  Rails.logger.error message: e.message, exception: e
  @error_data = { message: 'no record found', status: :not_found }
end

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Проблема в том, что вы вызываете тестируемый метод в тематическом блоке.

subject {controller.send(:update_person, 3)}

На самом деле он вызывается перед запуском примера и перед блоком before.

context 'not found the proposals' do
  before do
    allow(subject).to receive(:handle_exceptions)
  end

  it 'calls handle_exceptions' do
    controller.send(:update_person, "NOT A VALID ID")
    expect(subject).to have_received(:handle_exceptions)
  end
end

Но что касается тестов go, то это не хорошо. Вы тестируете реализацию update_person, а не реальное поведение. И вы вызываете метод с помощью update_person.send(:update_person, 3), вероятно, для тестирования частного метода .

Вместо этого вы должны проверить, что ваш контроллер возвращает код ответа 404 при попытке обновления с недопустимым идентификатором , Кроме того, почему вы настаиваете на заглушении Person.find, остается загадкой, поскольку вы можете вызвать исключение, просто передав неверный идентификатор. Только заглушка, когда вам действительно нужно.

0 голосов
/ 19 апреля 2020

После пары дней работы я понял причину, по которой я запутался в том, что я не понял, «кто вызвал эту функцию», и я думаю, что это самая важная вещь, которую нужно знать перед тестированием. Для метода, подобного этому:

class User::Controller
  def methodA
      methodB 
  end

  def methodB
     // ...
  end

Ошибка, которую я сделал, я думал, что methodB вызывается методами, но это не так. Он вызывается контроллером, и по этой причине я не могу заставить тест работать. Нужно многому научиться, и я надеюсь, что однажды у меня не будет такой ошибки, и я смогу помочь другим.

...