您如何测试是否已创建对象的新实例?

How do you test that a new instance of an object has been created?

我使用 C#、xUnit 和 Moq 进行单元测试。我有一个复杂类型的 属性 对象。对于 "clear" 属性 及其所有属性,我这样做:

this.ComplexTypeInstance = new ComplexType();

现在我试图断言 ComplexTypeInstance 已分配给一个全新的对象。我的第一个想法是将 ComplexTypeInstance 与 new ComplexType() 进行比较,看看它们是否相等。但是要执行类似的操作,我认为我必须重写 equals 运算符。有什么方法可以轻松检查所有属性是否都设置为默认值?或者有没有办法断言我已经更新了对象?

Or is there a way to assert that I've newed up the object?

只需使用ReferenceEquals比较新旧之间的引用。如果它们不同,则 属性 已被替换。

var origInstance = this.ComplexInstance;
... // Some operation
Assert.False(object.ReferenceEquals(this.ComplexInstance, origInstance));

稍微考虑一下之后,我想出了几个不同的场景来简化测试:

  1. 将 ComplexType 包装在工厂类方法中。我不喜欢这个 b/c 它只是意味着要再创建一个 class,我想避免拥有这样一个简单的工厂。

  2. 提取和覆盖 - 创建一个允许我删除具体依赖项的虚拟方法。 Google "Extract and Override" 如有疑问。我不喜欢这个 b/c 如果你不知道这种技术,它可能看起来很奇怪。

  3. 注入一个匿名函数,returns 对象的新实例。

  4. 一位同事提到我还可以使用 Mark Seeman 的 SemanticComparison 将我的 属性 与新对象进行比较。

我最终选择了第三个选项,通过构造函数注入它,尽管我的 IOC 容器无法轻松解析它,我不得不花几分钟试图让它解析它的绑定。但我让它工作得很好。也许我应该刚刚创建工厂。但我很高兴我从 class 中取出了依赖项。一开始我不想b/c 看起来很简单