1

我正在尝试使用 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
}
规格文件
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

所以我得到一个错误:

失败/错误:输入'update',:id => @user.id, :user => {:username => username+"abc"}, :format => :json ActionView::Template::Error: You have a nil 对象,当你没想到它!您可能期望有一个 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 update' # ./users_controller_spec.rb:34:in `block (4水平)在'

那么我可能调用 render_to_string 方法错了吗?

4

1 回答 1

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
于 2011-05-17T12:18:37.467 回答