Ruby on rails 当两个条件相等时,RSpec eq matcher返回失败
在控制器测试中,我正在测试是否为实例变量指定了正确的值 当我这样做的时候 expectassigns:conversations.to eq@user\u收件箱 RSpec告诉我: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
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属性的值定义相等,对于未保存的对象有一个特例