Ответ 1
Вы тестируете наличие flash[:success]
, но в вашем контроллере вы используете flash[:notice]
Я хочу проверить действие контроллера и наличие флеш-сообщений с помощью rspec.
Действие
def create
user = Users::User.find_by_email(params[:email])
if user
user.send_reset_password_instructions
flash[:success] = "Reset password instructions have been sent to #{user.email}."
else
flash[:alert] = "Can't find user with this email: #{params[:email]}"
end
redirect_to root_path
end
спецификации
describe "#create" do
it "sends reset password instructions if user exists" do
post :create, email: "[email protected]"
expect(response).to redirect_to(root_path)
expect(flash[:success]).to be_present
end
...
Но у меня есть ошибка:
Failure/Error: expect(flash[:success]).to be_present
expected `nil.present?` to return true, got false
Вы тестируете наличие flash[:success]
, но в вашем контроллере вы используете flash[:notice]
Лучший способ проверить флеш-сообщения - это shoulda gem.
Вот три примера:
expect(controller).to set_flash
expect(controller).to set_flash[:success]
expect(controller).to set_flash[:alert].to(/are not valid/).now
Если вас больше интересует содержимое флеш-сообщений, вы можете использовать это:
expect(flash[:success]).to match(/Reset password instructions have been sent to .*/)
или
expect(flash[:alert]).to match(/Can't find user with this email: .*/)
Я бы посоветовал не проверять конкретное сообщение, если это сообщение не критично и/или оно не меняется часто.
Другой подход заключается в том, чтобы исключить тот факт, что контроллер имеет флеш-сообщения и вместо этого записывает интеграцию. Таким образом, вы увеличите вероятность того, что вам не понадобится изменять тест, как только вы решите показать это сообщение с помощью JavaScript или каким-либо другим способом.
См. также fooobar.com/questions/112859/...
С: gem 'shoulda-matchers', '~> 3.1'
.now
следует вызывать непосредственно на set_flash
.
Использование set_flash
с квалификатором now
и указание now
после того, как другие квалификаторы больше не разрешены.
Вы хотите использовать now
сразу после set_flash
. Например:
# Valid
should set_flash.now[:foo]
should set_flash.now[:foo].to('bar')
# Invalid
should set_flash[:foo].now
should set_flash[:foo].to('bar').now