Ruby on rails 当两个条件相等时,RSpec eq matcher返回失败

Ruby on rails 当两个条件相等时,RSpec eq matcher返回失败,ruby-on-rails,rspec,Ruby On Rails,Rspec,在控制器测试中,我正在测试是否为实例变量指定了正确的值 当我这样做的时候 expectassigns:conversations.to eq@user\u收件箱 RSpec告诉我: Failure/Error: expect(assigns(:conversations)).to eq @user_inbox expected: #<ActiveRecord::Relation [#<Mailboxer::Conversation id: 4, subject: "Dude

在控制器测试中,我正在测试是否为实例变量指定了正确的值

当我这样做的时候

expectassigns:conversations.to eq@user\u收件箱

RSpec告诉我:

 Failure/Error: expect(assigns(:conversations)).to eq @user_inbox

   expected: #<ActiveRecord::Relation [#<Mailboxer::Conversation id: 4, subject: "Dude, what up?", created_at: "2014-10-21 08:43:50", updated_at: "2014-10-21 08:43:50">]>
        got: #<ActiveRecord::Relation [#<Mailboxer::Conversation id: 4, subject: "Dude, what up?", created_at: "2014-10-21 08:43:50", updated_at: "2014-10-21 08:43:50">]>

   (compared using ==)

   Diff:
我看到预期和实际之间没有差别。我想知道是什么导致此测试失败。

是的,因为这是两个ActiveRecord::Relation对象。您的实例变量是第一个,您创建了另一个名为conversations的实例变量

您应该使用以下内容测试行数或其他属性:

expect(assigns(:conversations).count).to eq @user_inbox.count

也许你应该改变测试策略

当您的测试难以编写时,您的代码是错误的,或者您的测试策略是错误的。我建议您在控制器的测试中没有测试查询结果

您应该模拟查询结果

describe 'GET user conversations' do
  before do
    your_user.stub(:conversations).and_return "foo bar"       
  end
  it 'assigns the conversations of the user' do
    get :user_conversation
    expect(assigns(:conversations)).to eq your_user.conversations
  end
end
或者你应该测试某个合作者。你应该接收:一些方法吗

describe 'GET user conversations' do
  before do
    some_collaborator.stub(:conversations)
  end
  it 'assigns the conversations of the user' do
    some_collaborator.should_receive(:conversations)
    get :user_conversation
  end
end
关系是基于实际的关系而不是结果集进行比较的。比如说,

User.where(:id => 123) == User.where(:email => "fred@example.com")
将返回false,即使查询结果都相同,因为实际查询不同

我怀疑您更关心的是查询结果,而不是它是如何组成的,在这种情况下,您可以使用a将关系转换为活动记录对象数组。请注意,活动记录仅基于id属性的值定义相等,对于未保存的对象有一个特例