it-roy-ru.com

Rspec 3 как проверить флеш сообщения

Я хочу проверить действие контроллера и наличие флеш-сообщений с помощью 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
66
Mike Andrianov

Вы проверяете наличие flash[:success], но в вашем контроллере вы используете flash[:notice]

62
rabusmar

Лучший способ протестировать флэш-сообщения - гем shoulda .

Вот три примера:

expect(controller).to set_flash
expect(controller).to set_flash[:success]
expect(controller).to set_flash[:alert].to(/are not valid/).now
41
Robin Daugherty

Если вас больше интересует содержание флеш-сообщений, вы можете использовать это:

expect(flash[:success]).to match(/Reset password instructions have been sent to .*/)

или же

expect(flash[:alert]).to match(/Can't find user with this email: .*/)

Я бы посоветовал не проверять конкретное сообщение, если это сообщение не является критическим и/или оно не меняется часто.

26
Mugur 'Bud' Chirica

С: 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
1
killerkiara

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

Смотрите также https://stackoverflow.com/a/13897912/2987689

0
Artur Beljajev