Rspec Rails 错误

Rspec Rails error

let(:valid_attributes) {
    {
      "first_name" => "MyString",
      "last_name" => "LastName",
      "email" => "email@example.com",
      "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

当我 运行 以上测试时,它失败了 Failure/Error: 期望(会话[:user_id]).to eq(valid_attributes["id"])

预计:无
得到: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

valid_attributes.id 与任何 Rails 魔法无关。您已将值(散列)分配给 let 中的 valid_attributes 并与它进行比较。此值在测试执行期间未更改,也未从数据库更新。 valid_attributes.id 从未设置 ⇒ 它是 nil

在后一种情况下,您执行 post 操作,然后检查该值是否已成功存储在数据库中。

valid_attributes 只是一个散列,它与您的 User 对象没有任何关系。您的 post 将创建一个 User 对象,该对象将有一个 id ,您基本上是在尝试通过您的测试期望来检查它是否存在。