Ошибка возникает из-за того, что заглушка «израсходована» при первом вызове find
. Второй find
не заглушен, поэтому вы получаете ошибку NoMethodError.
Кто-то может исправить меня, если я ошибаюсь, но .with
оказывает странное влияние на заглушки, когда вы вызываете его более одного раза. Кажется, что Rspec ассоциирует каждое сообщение с тем же типом аргумента с одной заглушкой. Но другой тип аргумента эффективно создает другую заглушку. Так что в вашем случае вы можете исправить это, вызвав второй find
со строкой:
User.stub!(:find).with(other_user.id.to_s).and_return(other_user)
, что вам повезло, потому что на самом деле контроллер ожидает строку в хэше params
.
Это не отвечает на более широкий вопрос: как заглушить несколько вызовов методов с параметрами одного и того же типа аргумента? По моему опыту, вы не можете этого сделать.
Конечно, вы можете обойти это, не указав аргументы вообще. В вашем случае я бы сказал, что тестирование find
само по себе не имеет отношения к вашему контроллеру - фактически вы проверяете, может ли ActiveRecord выполнить поиск в базе данных по первичному ключу, который уже хорошо протестирован. Так что, если вам нужно только заглушить ответы на find
в правильном порядке, вы можете сделать это:
User.stub!(:find).and_return(user,other_user)