2

假设我有这个代码

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

现在,在 Rspec 中,我想用不同的值测试控制器。
我如何some_other_value分配some_var
我看着存根,但它不起作用。我试过:

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

4

1 回答 1

2

如果您想测试some_var分配了 value some_value,那么您可以使用assigns(我注意到不在您的列表中):

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

但是,如果您要做的是实际覆盖some_valueto的分配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您的控制器操作中。

有关这方面的更多信息,另请参阅此讨论(有点旧但相关)。

于 2012-09-27T13:05:34.903 回答