c# – AutoFixture Likeness – 仅比较匹配的属性

我希望能够使用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或发送拉取请求.

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么