单元测试:克隆和平等

joe*_*erg 5 .net c# unit-testing

我正在编写单元测试并考虑实现类型的场景IClonable.所以当然我想要一个测试Clone()方法的单元测试.

[Test]
public void CloneObject()
{
    MyType original = new MyType();
    MyType clone = (MyType)original.Clone();

    // Assert for equality
}
Run Code Online (Sandbox Code Playgroud)

所以我的第一个任务是拥有Assert平等.我看到以下选项:

  • 浏览所有属性(字段)MyType并逐个检查它们
  • 覆盖Equals()in MyTypeMyType说明两个实例是否相等(考虑到有时测试的相等性被视为生产代码的相等性)
  • 如果实例是相同的,则检查某种序列化(对于那种情况MyType必须如此[Serializable],但如果它具有例如接口属性,有时很难做到)
  • ...?

对于前两个我可以设置我的测试,他们运作良好.但是,如果我更改MyType并添加其他属性怎么办?如果Clone()不复制这个并且我不将它添加到checked属性列表或equals方法中,即使没有复制属性,我的测试仍会通过.

你是如何解决这种测试的?

dca*_*tro 5

您可以使用FluentAssertions库(TDD必备,IMO),它具有ShouldBeEquivalent执行两个对象的图形比较的方法:

original.ShouldBeEquivalentTo(clone);
Run Code Online (Sandbox Code Playgroud)

比较算法可以通过可选options参数自定义; 有关详细信息,请参阅他们的wiki.

为了使测试面向未来的(即,它打破了当新的属性添加到类,而不是Clone法),你可能想测试克隆的对象,其所有属性设置为随机非默认值.AutoFixture可以为您做到这一点.

// Arrange
var fixture = new Fixture();
var original = fixture.Create<MyType>();

// Act
var clone = original.Clone();

// Assert
clone.ShouldBeEquivalentTo(original);
Run Code Online (Sandbox Code Playgroud)

有用的链接: