Ruby 更好的失败消息,用于断言集合中多个对象的属性

Ruby 更好的失败消息,用于断言集合中多个对象的属性,ruby,rspec,Ruby,Rspec,为了断言对象具有预期属性,我提出了自定义方法 def be_active_sales_order_with(quantity) expected = { :order_type => "sales", :activated_at => be_within(1.minute).of(Time.current), :quantity => quantity } have_attributes(expected) end 当上述方法与一个对象一

为了断言对象具有预期属性,我提出了自定义方法

def be_active_sales_order_with(quantity)
  expected = {
    :order_type => "sales",
    :activated_at => be_within(1.minute).of(Time.current),
    :quantity => quantity
  }

  have_attributes(expected)
end
当上述方法与一个对象一起使用时,失败消息提供了格式清晰的差异,即属性的值不同于预期值

失败消息:

预计#具有属性{:订单类型=>“销售”,:激活的{u at=>(在2019-11-26 15:56:17的300范围内),:数量=>3}但具有属性{:订单类型=>“销售”,:激活的{u at=>2019-11-24 15:56:17.000000000,:数量=>3}
差异:
@@-1,5+1,5@@@br> :订单类型=>销售,
-:在=>处激活(在2019-11-26 15:56:17的300范围内),
+:激活时间=>2019-11-2415:56:17.000000000,
:数量=>3

it "creates single order" do
   # configuration for single order

   orders = create_order.call(quantity: 3)

   expect(orders.only).to be_active_sales_order_with(3)
end
但对于可以创建多个订单的情况,如果不调试失败的测试,则很难读取失败消息

it "creates multiple orders" do
   # configuration for multiple order

   orders = create_order.call(quantity: 3)

   expect(orders).to contain_exactly(
     be_active_sales_order_with(3),
     be_active_sales_order_with(3),
     be_active_sales_order_with(3)
   )
end
失败消息:

预期包含的集合:[(具有属性{:订单类型=>“销售”,:激活的\>日期=>(在2019-11-26 15:56:17的300范围内),:数量=>3})]
实际收款包含:[订单id:885385454,客户id:367693892,主题:无,创建时间:2019-…,段键:“9bf937d687eaff19”,库存id:无,通知人:无,使用折扣:假,用户id:548091186]
缺少的元素是:[(具有属性{:订单类型=>“销售”,:激活的\>日期=>(在2019-11-26 15:56:17的300范围内),:数量=>3})]
额外的元素是:[订单id:885385454,客户id:367693892,主题:nil,创建时间:2019-…,段键:“9bf937d687eaff19”,库存id:nil,通知人:nil,使用折扣:false,用户id:548091186]


如何构建更具可读性的消息,在预期和实际对象属性之间提供可读性差异

当前差异是什么样子?@lacostenycoder,使用当前失败消息更新。我们可以看看这个问题