RSpec不太严格的平等期望测试

时间:2015-08-30 23:06:10

标签: ruby unit-testing testing rspec

我有以下测试:

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一样吗?没有运气。

2 个答案:

答案 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