我试图用rspec测试我的控制器并且总是出错。
users_controller.rb:
def update
@user.update_attributes!(params[:user])
redirect_to @user, :status => 202, :text => render_to_string(:partial => "users/show", :type => "json", :locals => {:user => @user})
#notice, that redirect_to was reinitialized and :text is a parameter for response_body
end
_show.tokamak
user {
id user.id
email user.email
username user.username
}
spec文件
it "should NOT update user username" do
username = @user.username
put 'update', :id => @user.id, :user => {:username => username+"abc"}, :format => :json
response.status.should be(202)
response.headers["Location"].length.should be > 0
puts response.body
@user.reload
@user.username.should eq(username)
end
end
所以我收到一个错误:
失败/错误:放'更新',:id => @ user.id,:user => {:username => 用户名+“abc”} ,: format => :JSON ::的ActionView ::模板错误: 当你没想到它时,你有一个零对象! 您可能期望一个Array实例。 评估nil时发生错误。[] #C:/Users/makaroni4/free_frog/ffapi/app/views/users/_show.tokamak:1:in
_app_views_users__show_tokamak___509498818 _32151168_368311673' # C:/Users/makaroni4/XXX/XXX/app/controllers/users_controller.rb:22:in
更新” #。/ users_controller_spec.rb:34:in '阻止(4级)'
那么我可能会调用render_to_string方法错误吗?
答案 0 :(得分:1)
尝试删除查找?
mock_user = User.stub(:find).with(@user.id) {@user}
说实话,我会更进一步,确保你模拟并存根User对象的大部分相关行为(或者@user是什么类)。请记住,您只是测试控制器操作返回您期望的内容,如果您给它有效的输入 - 而不是模型本身做正确的事情。
我很难解决模型与控制器规格的差异......
我希望这有帮助...如果没有,我提前道歉......
编辑:
我会更进一步,并建议这个测试实际上是一个模型测试。实际的控制器测试将与您的规范测试的行为类似:
it "should NOT update user with invalid input" do
mock_user = mock_model(User, {}).as_null_object
User.stub(:find).with("12") {mock_user}
User.stub(:update_attributes).with({}).and_return(false)
put 'update', :id => "12"
# test that your output is correct, or even if the render target is what you expect.
end