rails render_to_string问题

时间:2011-05-17 11:30:30

标签: ruby-on-rails rspec partial render-to-string

我试图用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方法错误吗?

1 个答案:

答案 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