我希望能够使用AutoFixture.SemanticComparison比较以下两个对象的相似性:
public class Object1 { public int a; } public class Object2 { public int a; public int b; }
现在,当我这样做的时候:
var o1 = new Object1 { a = 1 }; var o2 = new Object2 { a = 1,b = 2}; o1.AsSource().OfLikeness<Object2>().ShouldEqual(o2);
我得到以下例外:“以下成员不匹配: – b.”
我发现我可以省略’b’成员,如下所示:
var o1 = new Object1 { a = 1 }; var o2 = new Object2 { a = 1,b = 2}; o1.AsSource().OfLikeness<Object2>().Without(object2 => object2.b).ShouldEqual(o2);
但是,我发现这很麻烦,因为每当我向Object2类添加一个新成员时,我都要纠正我的单元测试(或者至少是单元测试助手).
有没有办法说“我想比较两个对象中存在的子集的相似性”?
解决方法
听起来你想根据它们的属性的交集来比较两个对象. Likeness类目前不支持此功能.原因是这样的:
现在,目标类型(在上面的例子中,它将是Object2)是完成匹配的决定性模板.这为断言提供了非常强烈的陈述:必须匹配此类的每个公共属性或字段.
但是,关于匹配属性交集的声明将是一个非常弱的语句,因为该交集可能是空的.这可能导致False Negatives.
即使您正在进行TDDing并且遵循红色/绿色/重构周期并且您已经看到单元测试未能通过这种假设的相似性交集,随后的重构可能会将这样的断言变为假否定,因为您删除了最后一个属性或字段这两个对象有共同点 – 你永远不会注意到.
但是,AutoFixture是开源的,所以欢迎您使用suggest this feature或发送拉取请求.