Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
RSpec控制器规范:确保控制器实例变量不会在多个';获取';_Rspec - Fatal编程技术网

RSpec控制器规范:确保控制器实例变量不会在多个';获取';

RSpec控制器规范:确保控制器实例变量不会在多个';获取';,rspec,Rspec,如果我们必须在同一规范上下文中执行多个get,那么控制器规范中是否有任何方法可以在每次get之前“重置”实例变量空间 我理解每个测试指南的一个断言。然而,对于我们的一组测试,如果我们在每次get之前不在(:each)之前进行单独的(冗长的)设置,并且如果我们在单个上下文中一起运行一系列get/断言,那么它的运行速度大约快3倍 然而,似乎(与通过浏览器调用控制器方法不同)如果您使用rspec执行两个连续的get,那么每个get都不会清除实例变量,因此数据交叉是可能的 下面是一个失败的测试,表明在运

如果我们必须在同一规范上下文中执行多个get,那么控制器规范中是否有任何方法可以在每次get之前“重置”实例变量空间

我理解每个测试指南的一个断言。然而,对于我们的一组测试,如果我们在每次get之前不在(:each)之前进行单独的(冗长的)设置,并且如果我们在单个上下文中一起运行一系列get/断言,那么它的运行速度大约快3倍

然而,似乎(与通过浏览器调用控制器方法不同)如果您使用rspec执行两个连续的get,那么每个get都不会清除实例变量,因此数据交叉是可能的

下面是一个失败的测试,表明在运行另一个控制器方法“vartest2”时,“vartest1”中的变量集仍然存在:

控制器方法:

  def vartest1
    @this_var = "foo" 
    render :text => @this_var
  end

  def vartest2
    render :text => @this_var # should be EMPTY!
  end
Rspec控制器规格:

  describe "instance variable crossover example", :focus => true do
    describe "THIS PASSES put each get in separate contexts" do
      it "vartest1 outputs foo" do
        get "vartest1"
        response.body.should include("foo")
      end
      it "vartest2 does NOT output foo" do
        get "vartest2"
        response.body.should_not include("foo")
      end
    end
    describe "THIS FAILS put both gets in SAME context" do
      it "should not crossover controller instance varables" do
        get "vartest1"
        response.body.should include("foo")
        get "vartest2"
        response.body.should_not include("foo") # THIS FAILS
      end
    end
  end
Rspec结果:

 instance variable crossover example
    THIS PASSES put each get in separate contexts
      vartest1 outputs foo
      vartest2 does NOT output foo
    THIS FAILS put both gets in SAME context
      should not crossover controller instance varables (FAILED - 1)

失败测试中发生的情况是,当rspec执行
get'vartest1'
时,控制器方法将实例变量设置为'foo',当rspec执行
get'vartest2'
时,实例变量(应为nil)仍被设置,因此测试失败。

控制器规范是单元测试。与所有单元测试一样,它们应该单独测试方法。对于控制器,这意味着每个动作都需要自己的规格。在控制器规范中执行多个请求不太可能实现任何目的

你可以考虑使用请求规范,或者黄瓜。根据您的环境,这可能会得到更好的结果,因为每个示例只需要进行一次设置。然后可以执行多个

获取
(或
访问


另一种可能是对控制器规格使用模拟/存根。这可以显著提高性能,但代价是进行额外的设置。控制器规格的RSpec脚手架示例是这种方法的一个很好的起点。

如果您想避免在(:each)之前使用冗长的
块的速度问题,我建议改为使用,这是一种惰性评估。将多个
get
请求放在一个规范中是个坏主意。