AutoFixture Likeness - 仅比较匹配的属性

时间:2012-02-18 12:29:37

标签: c# unit-testing autofixture

我希望能够使用AutoFixture比较以下两个对象的相似性。语义比较:

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类添加一个新成员时,我都要纠正我的单元测试(或者至少是单元测试助手)。

有没有办法说“我想比较两个对象中存在的子集的相似性”?

1 个答案:

答案 0 :(得分:8)

听起来您希望根据其属性的交叉点来比较两个对象。 Likeness类目前不支持此功能。原因是:

现在,目标类型(在上面的例子中,它将是Object2)是完成匹配的决定性模板。这为断言提供了非常强大的语句:必须匹配此类的每个公共属性或字段。

但是,关于匹配属性交集的声明将是一个非常语句,因为交集可能为空。这可能会导致False Negatives

即使您正在进行TDDing并且遵循红色/绿色/重构周期并且您已经看到单元测试失败了这样一个假设的相似性交集,随后的重构可能会将这样的断言变为假否定,因为您删除了最后一个属性或字段这两个对象有共同点 - 你永远不会注意到。

但是,AutoFixture是开源的,所有,欢迎您suggest this feature或发送拉取请求。