2016-02-10 67 views
0
let(:valid_attributes) { 
    { 
     "first_name" => "MyString", 
     "last_name" => "LastName", 
     "email" => "[email protected]", 
     "password" => "password12345", 
     "password_confirmation" => "password12345" 
    } 
    } 

it "sets session when" do 
     post :create, {:user => valid_attributes}, valid_session 
     expect(session[:user_id]).to eq(valid_attributes.id) 
end 

當我上述試驗運行,它失敗 故障/錯誤:預期(會話[:USER_ID])。爲eq(valid_attributes [ 「ID」])Rspec的滑軌誤差

預期:無
得到:1

但是,當我改變它下面的代碼,它通過測試。但是這兩者之間有什麼區別。爲什麼第一個失敗。

it "sets session when" do 
     post :create, {:user => valid_attributes}, valid_session 
     expect(session[:user_id]).to eq(User.find_by(email: valid_attributes["email"]).id) 
end 

回答

1

valid_attributes.id與任何Rails的魔法無關。您已將值(散列)分配給,並與let進行比較。該值在測試執行過程中未更改,也未從數據庫更新。 valid_attributes.id從未設置⇒它是nil

在後一種情況下,您將執行後操作,然後檢查該值是否已成功存儲在數據庫中。

1

valid_attributes是一個簡單的散列,它與您的User對象沒有任何關係。您的帖子將創建一個User對象,該對象將有一個id,您基本上試圖通過您的測試期望檢查是否存在。