【问题标题】:AutoFixture Likeness - compare only matching propertiesAutoFixture Likeness - 仅比较匹配的属性
【发布时间】:2012-02-18 12:29:37
【问题描述】:

我希望能够使用 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 类添加新成员时,我都必须更正我的单元测试(或者至少是单元测试助手)。

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

【问题讨论】:

    标签: c# unit-testing autofixture


    【解决方案1】:

    听起来您想根据两个对象的属性的交集来比较它们。 Likeness 类目前不支持此功能。原因是这样的:

    现在,目标类型(在上面的示例中为 Object2)是完成匹配的决定性模板。这为断言提供了一个非常strong的声明:这个类的每个公共属性或字段都必须匹配。

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

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

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

    【讨论】:

    • 你描述的论点是相当有力的。它让我开始思考什么更麻烦 - 向Without() 添加新属性或跟踪两个对象的属性名称更改以避免误报。感谢您将我的注意力转向这个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2022-12-02
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多