Rspec 3 як перевірити флеш-повідомлення


81

Я хочу перевірити дію контролера та наявність флеш-повідомлень за допомогою 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@example.com"      
    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

Відповіді:


67

Ви перевіряєте наявність flash[:success], але в контролері, який ви використовуєтеflash[:notice]


О, вибачте, я щойно прослизнув сюди. Та сама помилка зі спалахом [: повідомлення]
Майк Андріанов

3
У цьому випадку проблема, можливо, полягає в коді контролера та / або даних тесту. Спробуйте змінити значення expect(flash[:notice])на expect(flash[:alert]), і якщо тест пройде, то, ймовірно, просто тестового електронного листа не існує.
rabusmar

48

Кращий спосіб повідомлення тестування флеш забезпечується Shoulda камінь.

Ось три приклади:

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

34

Якщо вас більше цікавить вміст флеш-повідомлень, ви можете використовувати це:

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

або

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

Я б радив не перевіряти конкретне повідомлення, якщо це повідомлення не є критичним та / або воно не змінюється часто.


5

З: 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

0

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

Див. Також https://stackoverflow.com/a/13897912/2987689

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.