当前位置: 首页 > 知识库问答 >
问题:

RSpec控制器规格:确保控制器实例变量不会在多个“get”之间交叉的任何方法

岳阳飙
2023-03-14

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

我理解每个测试一个断言的指导方针。但是,对于我们的一组测试,如果我们在每个get之前不在(: each)设置之前进行单独的(冗长的)设置,并且如果我们在单个上下文中一起运行一系列get/asserts,它的运行速度会快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执行获取“vartest1”时,控制器方法将实例变量设置为“foo”,当rspec执行获取“vartest2”时,实例变量(应为nil)仍被设置,因此测试失败。

共有1个答案

长孙阳州
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 我有两个Angular控制器: 我无法使用内部,因为它是未定义的。但是,如果我尝试像这样传递它… 我得到一个错误。有谁知道如何做到这一点? 在做 也失败。 注意: 这些控制器彼此之间不嵌套。 问题答案: 在多个控制器之间共享变量的一种方法是创建服务并将其注入到要使用它的任何控制器中。 简单服务示例: 在控制器中使用服务: 这个博客对此进行了很好的描述(特别是第2课)。 我发现,如果要跨

  • 问题内容: 我几乎与Nathon Taylor在ASP.NET MVC- 控制器之间的共享会话状态中描述的场景完全相同。问题是,如果我将路径保存到Session变量中的图像,则不会在ItemController中定义它,因此所有路径都将丢失…这是我的设置: 在ImageController内部,我具有Upload()操作方法: 然后在我的ItemController中,我有New()操作方法,该方

  • 问题内容: 我是angular的新手,我想知道如何在angular的控制器之间共享变量。我正在使用以下脚本- 在Main.js中: 在Index.html中 我正在发送数据并接收响应的ajax一切正常,我的问题如下: 在SearchCtrl函数中,我有一个名为$ scope.result的变量,稍后在Index.html中进行引用。如果我将包含该变量的html代码插入SearchCtrl控制器,则

  • 我知道有很多关于传递参数的线程,但我仍然不明白。 我有阶段与类。在这个类中,我创建了例如变量。然后我单击此阶段上的按钮,它使用创建新阶段,我可以在其中修改此值。在中是值的setter和getter方法。在中,我可以从中获取值并对其进行编辑,但最后当我关闭第二阶段时,我尝试通过中的setter方法将此编辑后的值设置为新数字。然后我关闭它,然后像第一次一样再次打开它。但是我看不到新的编辑值,我再次看到

  • 问题内容: 我有3个执行类似任务的控制器: PastController 向API查询过去的系统中断。 CurrentController 向API查询当前系统中断 FutureController 向API查询将来的系统中断 它们每个都是唯一的(尽管它们具有相似的功能)。但是,它们都从定义相同的变量开始: 我可以使用服务或工厂在一处初始化这些变量,而不用重复代码吗? 问题答案: 我没有测试代码,

  • 问题内容: 我正在阅读有关Angular验证的文章,并认为在我自己的项目中使用它会很好。它运行得非常好,我想在成功验证表单后在其他控制器中扩展它的访问方法。我尝试了各种方法来执行此操作,但似乎看不到$ scope对象中的方法。 我希望有人能告诉我我想念的东西才能完成这项工作。我叉了个笨蛋。 问题答案: 正确的方法是使用角度服务。例如: 这样,您可以在注入到的任何控制器中访问内部功能: 看到这个演示