Я думаю, вы путаете заглушки с ожиданиями сообщений.Строка
User.should_receive(:find)
указывает Rspec ожидать, что пользовательская модель получит сообщение о поиске.Принимая во внимание, что:
User.stub!(:find)
заменяет метод поиска, чтобы тест мог пройти.В вашем примере вы проверяете, успешно ли вызывается update_attributes
, так что это должно быть именно там, где идет ожидание сообщения, а задача всего остального кода тестирования - просто установить предварительные условия.
Попробуйте заменить эту строку на:
User.stub!(:find).and_return(@user)
Обратите внимание, что find
возвращает объект, а не только его идентификатор.Также обратите внимание, что заглушка find
здесь служит только для ускорения процесса.Как написано, пример успешно проходит через should_receive(:find)
и , что происходит, потому что вы используете фабрики для создания пользователей в тестовой базе данных.Вы можете снять заглушку, и тест все равно будет работать, но ценой попадания в базу данных.
Еще один совет: если вы пытаетесь выяснить, почему тест контроллера не работает, иногда этополезно знать, не блокируется ли это before
фильтрами.Вы можете проверить это с помощью:
controller.should_receive(:update)
Если это не удастся, действие update
не будет достигнуто, возможно, потому что фильтр before
перенаправил запрос.