我想用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
5条答案
按热度按时间cs7cruho1#
您正在测试
flash[:success]
是否存在,但在控制器中使用的是flash[:notice]
zlhcx6iw2#
shoulda gem提供了测试flash消息的最佳方法。
以下是三个示例:
kxkpmulp3#
如果您对即时消息的内容更感兴趣,可以使用以下内容:
或
我建议不要检查特定的消息,除非该消息是关键的和/或它不经常更改。
x6492ojm4#
具有:
gem 'shoulda-matchers', '~> 3.1'
应该直接在
set_flash
上调用.now
。不再允许将
set_flash
与now
限定符一起使用,并在其他限定符之后指定now
。在
set_flash
之后要立即使用now
。例如:agyaoht75#
另一种方法是忽略控制器有flash消息这一事实,而是编写一个集成测试。这样,当你决定使用JavaScript或其他方法显示消息时,你就不需要修改测试了。
另请参阅https://stackoverflow.com/a/13897912/2987689