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
spec:
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
5 ответов:
лучший способ проверить флэш-сообщения предоставлена должен был камень.
вот три примера:
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: .*/)
Я бы не советовал проверять конкретное сообщение, если это сообщение не является критическим и / или оно не меняется часто.
С:
gem 'shoulda-matchers', '~> 3.1'
The
.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
другой подход заключается в том, чтобы исключить тот факт, что контроллер имеет флэш-сообщения и вместо этого написать интеграционный тест. Таким образом, вы увеличиваете вероятность того, что вам не нужно будет изменять тест, как только вы решите показать это сообщение с помощью JavaScript или каким-либо другим способом.
Смотрите также https://stackoverflow.com/a/13897912/2987689