Rspec存根操作变量



让我们假设我有这个代码

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

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

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

然而,如果您想实际覆盖some_valuesome_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

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

最新更新