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

У меня есть контроллер рельсов, который я хотел бы проверить методом test_method.

class ActiveController < ActionController::Base
  def test_method
    user = acc_users.all_users.find params[:id]
    if !user.active?
      user.call_method!
    end
  end
end

Я должен проверить, что call_method не вызывается. Это то, что я придумал, но я не думаю, что это сработает.

 it "should not call call_method" do
    u = user(@acc)
    put :test_method, :id => u.id
    expect(u).not_to have_received(:call_method!)
  end

Я следил за этим вопросом здесь и обнаружил, что он почти аналогичен, за исключением того, что вызываемый метод находится в другом классе. Когда я пытаюсь выполнить приведенный выше код, я получаю сообщение об ошибке типа «Ожидается, что объект ответит на has_received?»

Я полагаю, что не смогу проверить это с данной настройкой, поскольку пользователь не вводится вtest_method.

call_method - это вызов метода, который ставит в очередь задание, поэтому я хочу быть уверенным, что он не будет вызван.

Как мне провести тестирование этого метода?

1 Ответ

0 голосов
/ 29 октября 2019

Вы можете использовать метод Outlook_any_instance_of на модели User с числом, скажем, «n», чтобы проверить, что модель получает определенный метод «n» раз.

Такжевы должны установить это ожидание ДО фактического вызова вашего действия, потому что ожидание основано на том, что происходит внутри самого действия, а не на том, что возвращает действие.

Следующая строка должна работать, предполагая, что вашеПеременная user является экземпляром класса User:

u = user(@acc)
expect_any_instance_of(User).to receive(:call_method!).once
put :test_method, :id => u.id

Альтернативно, вы можете изменить спецификацию на поведение, похожее на черный ящик, а не на тестирование вызовов определенных методов. Например, вы могли бы издеваться над call_method!, чтобы всегда возвращать такое значение, как, а затем продолжить ваш тест, основываясь на этом, если это возможно. Это может быть достигнуто с помощью expect_any_instance_of(User).to receive(:call_method!).and_return(<some_object>). Позже можно предположить, что ваш тест будет вести себя в соответствии со значением, которое вы установили. Это альтернативное решение является всего лишь предложением, и вполне вероятно, что оно может не работать в соответствии с вашими конкретными потребностями.

...