Quiero probar la acción del controlador y la presencia de mensajes flash con rspec.
acción :
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
especificación :
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
...
Pero tengo un error:
Failure/Error: expect(flash[:success]).to be_present
expected `nil.present?` to return true, got false
ruby-on-rails
ruby
rspec
Mike Andrianov
fuente
fuente
expect(flash[:notice])
aexpect(flash[:alert])
, y si la prueba pasa, probablemente es solo que el correo electrónico de prueba no existe.La mejor manera de probar los mensajes flash la proporciona la joya shoulda .
A continuación, se muestran tres ejemplos:
expect(controller).to set_flash expect(controller).to set_flash[:success] expect(controller).to set_flash[:alert].to(/are not valid/).now
fuente
Si está más interesado en el contenido de los mensajes flash, puede usar esto:
expect(flash[:success]).to match(/Reset password instructions have been sent to .*/)
o
expect(flash[:alert]).to match(/Can't find user with this email: .*/)
Aconsejaría no verificar un mensaje específico a menos que ese mensaje sea crítico y / o no cambie con frecuencia.
fuente
Con:
gem 'shoulda-matchers', '~> 3.1'
Se
.now
debe llamar directamente en elset_flash
.Ya no se permite usar
set_flash
con elnow
calificador y especificarnow
después de otros calificadores.Querrás usar
now
inmediatamente despuésset_flash
. Por ejemplo:# 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
fuente
El otro enfoque es dejar de lado el hecho de que un controlador tiene mensajes flash y escribir una prueba de integración en su lugar. De esta manera, aumenta las posibilidades de que no necesite modificar la prueba una vez que decida mostrar ese mensaje usando JavaScript o de alguna otra manera.
Consulte también https://stackoverflow.com/a/13897912/2987689
fuente