【问题标题】:Rspec stub action variableRspec 存根操作变量
【发布时间】:2012-09-27 12:31:23
【问题描述】:

假设我有这个代码

class SomeController < ApplicationController
  def some_methode
    some_var = some_value
    render text: some_var
  end
end

现在,在 Rspec 中,我想用不同的值测试控制器。
我如何将some_other_value 分配给some_var
我查看了stub,但它不起作用。我试过了:

assign(:some_var, some_other_value )
controller.some_methode.stub(some_var: some_other_value )
some_methode.stub(some_var: some_other_value )
controller.some_methode.stub!(some_var: some_other_value )
controller.some_methode.stub(:some_var).and_return(some_other_value )

它们都不起作用。 some_var 不会更改为 some_other_value

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rspec rspec2 rspec-rails


    【解决方案1】:

    如果您想测试 some_var 是否被赋值为 some_value,那么您可以使用 assigns(我注意到它不在您的列表中):

    it "assigns some_value to some_var" do
      get :some_method
      assigns(:some_var).should == some_value
    end
    

    但是,如果您想要真正覆盖some_value 分配给some_var,那么我的建议是重新考虑(并可能重构)您的控制器代码。我不相信这在 rspec 中是可能的,但即使是这样,我也不认为在这里做正确的事情。

    如果some_value 的值会发生变化,那么最好为它创建一个控制器方法并存根该方法。

    例如,在您的控制器代码中创建一个方法 get_value 并将 some_var 分配给它:

    def some_method
      some_var = get_value
      render text: some_var
    end
    
    private
    
    def get_value
      some_value
    end
    

    然后你可以在你的规范中存根get_value

    it "does something when some_var is assigned value_to_test" do
      controller.stub(:get_value).and_return(value_to_test)
      get :some_method
      ... should ...
    end
    

    另一方面,如果 some_value 来自 params 哈希,那么您可以通过更改传入到 HTTP 操作调用的内容来控制它:

    it "does something when passed value_to_test" do
      get :some_method, :some_var => value_to_test
      ... should ...
    end
    

    这将在您的控制器操作中将params[:some_var] 设置为value_to_test

    有关更多信息,另请参阅this discussion(有点旧但相关)。

    【讨论】:

    • 奇怪的是你可以存根 instans vars 但不能存根常规 vars。我最终按照您的建议对其进行了重构。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多