2017-03-09 45 views
2

我使用C#,xUnit和Moq进行单元测试。我有一个具有复杂类型属性的对象。 “清”的性质和它的所有属性,我这样做:如何测试已创建对象的新实例?

this.ComplexTypeInstance = new ComplexType(); 

现在我想要断言ComplexTypeInstance已被分配到一个全新的对象。我的第一个想法是将ComplexTypeInstance与新的ComplexType()进行比较,看它们是否相等。但要做这样的事情,我想我必须重写equals运算符。有什么方法可以轻松检查所有属性是否设置为默认值?或者有没有办法断言我已经发现了这个对象?

回答

6

或者有没有办法断言我已经发现了这个对象?

只需使用ReferenceEquals比较旧版本和新版本之间的引用。如果他们不同,那么该房产已被替换。

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

想着这一点后,有几个不同的方案,我想出了更容易测试:

  1. 裹在工厂排序方法的ComplexType。我不喜欢这个B/C,它只是意味着要创建一个课程,我想避免拥有这样一个简单的工厂。

  2. 提取和覆盖 - 创建一个虚拟方法,允许我删除具体的依赖项。如果您有任何问题,请点击Google“提取并覆盖”。如果你不知道这种看起来很奇怪的技术,我不喜欢这种B/C。

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

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

我结束了第三个选项去,将其注入通过构造,虽然我的IOC容器不能轻易解决这个问题,我不得不花了几分钟的努力得到它,解决它的绑定。但我的工作很好。也许我应该创建工厂。但我很高兴从课堂上拿掉了依赖。起初我不想看起来那么简单。