6

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

我理解每个测试一个断言的指导方针。但是,对于我们的一组测试,如果我们在每次获取之前不进行单独的(冗长的) before(:each) 设置并且如果我们在单个上下文中一起运行一系列获取/断言,它的运行速度大约会快 3 倍.

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

这是一个失败的测试,表明当另一个控制器方法 '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)

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

4

1 回答 1

2

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

您可以考虑使用请求规范或 Cucumber。根据您的环境,这可能会为您带来更好的结果,因为每个示例只需要进行一次设置。然后你可以做多个gets(或visits)。

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

于 2013-01-04T03:12:54.027 回答