Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RSpec规范中存根闪存?_Ruby On Rails_Ruby_Unit Testing_Ruby On Rails 4_Rspec - Fatal编程技术网

Ruby on rails 如何在RSpec规范中存根闪存?

Ruby on rails 如何在RSpec规范中存根闪存?,ruby-on-rails,ruby,unit-testing,ruby-on-rails-4,rspec,Ruby On Rails,Ruby,Unit Testing,Ruby On Rails 4,Rspec,在我看来,我有一个hidden\u field\u标签,其值是控制器中设置的flash。换言之,流程如下所示: 控制器: def home flash[:id] = 123 end 查看: <% form_tag(new_invitee_path) %> <%= hidden_field_tag :referer, flash[:id] %> <% end %> 我可以确认,在手动测试中,这是正确的,但我不知道如何正确地存根。 在我的测试中,我

在我看来,我有一个
hidden\u field\u标签
,其值是控制器中设置的
flash
。换言之,流程如下所示:

控制器:

def home
    flash[:id] = 123
end
查看:

<% form_tag(new_invitee_path) %>
  <%= hidden_field_tag :referer, flash[:id] %>
<% end %>
我可以确认,在手动测试中,这是正确的,但我不知道如何正确地存根。

在我的测试中,我有:

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
flash[:id]=123
#或
flash.now[:id]=123
#两个呈现错误:未定义的局部变量或方法“flash”#
#还尝试了一种在线策略,为响应对象设置flash,如下所示:
访问“/家”
响应.flash[:id]=123
#或
response.flash.now[:id]=123
#两个呈现错误:未定义的局部变量或方法“response”#
#我在网上读到过,闪存扫描有问题,所以我尝试删除扫描,但不清楚如何正确设置匿名控制器或其他什么
controller.instance_eval{flash.stub!(:sweep)}
flash[:id]=123
#或
flash.now[:id]=123
#呈现错误:nil:NilClass的未定义局部变量或方法“flash”

您的规范是功能规范,因此规范环境无法访问flash之类的东西。不要试图直接使用闪光灯。相反,理想情况下,如果flash值设置为应该的方式,则测试用户对应用程序的视图的外观和/或行为。我不会只是测试隐藏字段是否存在于表单中;我会在提交表格后测试它是否具有应有的效果。这就是特性规范的全部内容:从用户的角度测试应用程序是否作为一个整体工作


如果flash值从未在UI中使用过,只是记录或存储在数据库中,则可以测试日志行或模型对象是否具有存储在flash中的值。(这里的用户是管理员,稍后会查看日志或其他内容。)但如果flash确实影响UI,则最好进行测试。

这对我来说似乎很有效:

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

好的,这很公平,在这种情况下,我想将隐藏值设置为123本身,这样它就被传递了,我可以检查它是否被保存到新对象中。那么在RSPEC中有没有这样做的方法?它真的只是一个硬编码的数字吗?如果是这样,只需将其移动到一个常数,并在测试中引用该常数。如果它真的来自某个方法或其他东西,您可以存根该方法,或者在测试中安排一些事情,以便该方法返回您可以在最后断言的一些选择。这很好,至少对于控制器规范来说——遗憾的是,现在没有更简单的方法了!对于在这方面遇到困难的人来说,较新的语法是
allow\u any\u instance\u of(descripted\u class.)。to receive(:flash)。and\u return(some:“thing”)
YourController.any_instance.stub(:flash) { {some: "thing" }}