2011-05-17 57 views
1

我試圖用rspec測試我的控制器,並總是得到一個錯誤。rails render_to_string問題

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 

所以我得到一個錯誤:

Failure/Error: put 'update', :id => @user.id, :user => {:username => username+"abc"}, :format => :json ActionView::Template::Error: You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating 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 levels) in '

所以可我打電話render_to_string方法錯誤?

回答

1

嘗試找出找到?

mock_user = User.stub(:find).with(@user.id) {@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 
+0

非常感謝!這實際上是我的錯,我沒有提到我使用Fabricator製作@user,並且它工作正常)。問題肯定在render_to_string(沒有此方法的測試工作正常)。 – makaroni4 2011-05-17 12:30:24