2016-08-23 33 views
0

当我测试我的控制器,我做了一件这样的失败:RSpec的比较空的ActiveRecord ::关系

bar = SuperDuper.calculate(resource) 
expect(assigns(:foo)).to eq(bar) 

我得到这个结果

expected: #<ActiveRecord::Relation []> 
    got: #<ActiveRecord::Relation []> 

(compared using ==) 

为什么RSpec的认为这是失败?

正如你所看到的,我使用eq忽略了对象标识,而不是equal,它比较了对象标识。

+0

也许rspec通过链接断言对象是相等的。所以你有两个相同的对象,但它们指向内存中的不同区域。考虑比较价值而不仅仅是对象比较 – tmn4jq

+0

@ tmn4jq在这里我使用'eq'来比较值,而不是使用'equal'来比较对象标识 –

+0

调试与'expect(assigns(:foo).to_a).to eq bar.to_a)'或'expect(赋值(:foo).to_sql).to eq(bar.to_sql)'。 –

回答

0

我不确定,但你eq意味着==。证明:https://www.relishapp.com/rspec/rspec-expectations/v/2-0/docs/matchers/equality-matchers

还应注意这个: a.eql?(b) # object equivalence - a and b have the same value

从这儿:Rspec `eq` vs `eql` in `expect` tests

所以,我认为你应该尝试eql匹配。

+0

我得到这个: '预计:#''得到:#''(使用eql进行比较)' –

+1

@MohamedAnwer考虑阅读:http: //stackoverflow.com/questions/26482564/rspec-eq-matcher-returns-failure-when-two-things-are-equal,https://www.relishapp.com/rspec/rspec-rails/docs/matchers/ activerecord-relation-match-array和http://stackoverflow.com/questions/26935630/rspec-matchers-when-working-with-activerecordrelation – tmn4jq