我们假设我有这个代码
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
答案 0 :(得分:2)
如果您想测试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(有点陈旧但相关)。