我有以下测试:
it "can add an item" do
item = Item.new("car", 10000.00)
expect(@manager.add_item("car", 10000.00)).to eq(item)
end
项目的初始化看起来像(类有attr_accessor for,type,price和is_sold):
def initialize(type, price)
@type = type
@price = price
@is_sold = false
@@items << self
end
经理的添加项目如下:
def add_item(type, price)
Item.new(type, price)
end
此测试目前失败,因为这两个项目具有不同的对象ID,尽管它们的属性相同。 Item的初始化方法需要一个类型和一个价格。我只想检查这些功能是否相等......有没有办法严格测试属性相等性?
我试过应该是,应该和eql一样吗?没有运气。
答案 0 :(得分:1)
假设您的班级有一个公共界面来阅读这些属性(例如attr_reader :type, :price
),那么最明智的方法可能是实施==
方法:
class Item
# ...
def ==(other)
self.type == other.type &&
self.price == other.price
end
end
这允许使用==
比较任意两个项目,因此RSpec的eq
方法将按预期工作。
如果你不希望你的班级有一个平等的方法,你最好的选择可能是分别检查每个属性:
it "can add an item" do
expected = Item.new("car", 10000.00)
actual = @manager.add_item("car", 10000.00)
expect(actual.type).to eq(expected.type)
expect(actual.price).to eq(expected.price)
end
但是,正如您可以说,在向Item添加功能时,这可能会成为可维护性挑战。
答案 1 :(得分:0)
我建议:
it "can add an item" do
item0 = Item.new("car", 10000.00)
item1 = @manager.add_item("car", 10000.00)
expect(item0.name==item1.name && item0.type==item1.type)
end