如何在RSpec规范中存根闪存?

时间:2014-09-18 18:04:01

标签: ruby-on-rails ruby unit-testing ruby-on-rails-4 rspec

在我看来,我有一个hidden_field_tag,其值在控制器中设置为flash。换句话说,流程如下:

控制器:

def home
    flash[:id] = 123
end

查看:

<% form_tag(new_invitee_path) %>
  <%= hidden_field_tag :referer, flash[:id] %>
<% end %>

提交给new_invitee_path的参数

{ "referer" => "123" }

我可以确认在手动测试中这是正常的,但我无法弄清楚如何正确存根。

在我的测试中,我有:

before do
  #set flash
  visit '/home'
  fill_in "rest_of_form"
  click_button "submit_form
end

以下是我尝试为set flash做的事情以及我收到的错误消息:

flash[:id] = 123 
# OR
flash.now[:id] = 123 
# both render error: undefined local variable or method `flash' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fc1040f7d60>

# Have also tried a tactic found online to set flash for response object like this:
visit '/home'
response.flash[:id] = 123
# OR
response.flash.now[:id] = 123
# both render error: undefined local variable or method `response' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fe118a38490>

#Have read online that it's a problem with the flash being sweeped, so I tried to stub out the sweep, but am unclear how to set the anonymous controller or whatever correctly
controller.instance_eval{flash.stub!(:sweep)}
flash[:id] = 123 
# OR
flash.now[:id] = 123 
# renders error: undefined local variable or method `flash' for nil:NilClass

2 个答案:

答案 0 :(得分:4)

您的规范是功能规范,因此规范环境无法访问Flash等内容。请勿尝试直接使用闪光灯。相反,理想情况下,测试用户的应用程序视图的外观和/或行为方式,如果按照应该的方式设置闪存值,应该采用的方式。我不会只是测试隐藏字段是否存在于表单中;我测试它在表单提交后应该具有的效果。这是什么功能规格的全部内容:从用户的角度测试应用程序的整体工作。

如果在UI中没有使用过闪存值,只是记录或存储在数据库中,则可以测试日志行或模型对象是否具有存储在数据库中的值。闪。 (此处的用户是管理员,他们会查看日志或稍后的内容。)但如果闪存确实影响了用户界面,那么测试更可取。

答案 1 :(得分:2)

这对我来说似乎很有效:

YourController.any_instance.stub(:flash) { {some: "thing" }}