gpt4 book ai didi

ruby - Rspec 相等方法

转载 作者:数据小太阳 更新时间:2023-10-29 06:31:25 25 4
gpt4 key购买 nike

据我了解,equal 方法检查对象是否相同。

person = Person.create!(:name => "David")
Person.find_by_name("David").should equal(person)

这应该是真的。

但是这里不是有两个不同的对象吗?

两个对象怎么可能相同?我不明白。

最佳答案

Rails 和 RSpec 等式测试有多种选择。

Rails 3.2 ActiveRecord::Base 使用 == 等式匹配器。

它以两种不同的方式返回真值:

  • 如果self 与比较对象完全相同
  • 如果self与比较对象是同一类型且具有相同的ID

注意 ActiveRecord::Base 有 == 方法,别名为 eql?。这与典型的 Ruby 对象不同,后者定义 ==eql? 的方式不同。

RSpec 2.0 在 rspec-expectations 中有这些相等匹配器:

a.should equal(b) # passes if a.equal?(b)
a.should eql(b) # passes if a.eql?(b)
a.should == b # passes if a == b

RSpec 也有两个相等匹配器,目的是让它们有更多的 DSL 感觉:

a.should be(b) # passes if a.equal?(b)
a.should eq(b) # passes if a == b

在您的示例中,您正在创建一条记录然后找到它。

所以你有两种测试#find_by_name的选择:

  • 要测试它是否检索到完全相同的对象具有相同 ID 的等效 Person 记录,然后使用 should == 或其等效的 a.should eql或其DSL版本should eq

  • 要测试它是否使用完全相同的对象不是具有相同 ID 的等效 Person 记录,然后使用 should equal 或其 DSL 版本 应该是

关于ruby - Rspec 相等方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3436234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com