我正在使用C#,xUnit和Moq进行单元测试。我有一个具有复杂类型属性的对象。为了“清除”该属性及其所有属性,我这样做:
this.ComplexTypeInstance = new ComplexType();
现在我试图断言ComplexTypeInstance已分配给一个全新的对象。我的第一个想法是将ComplexTypeInstance与新的ComplexType()进行比较,看看它们是否相等。但要做那样的事情,我想我必须覆盖equals运算符。有没有办法轻松检查所有属性是否设置为默认值?或者有没有办法断言我已经新建了这个对象?
答案 0 :(得分:6)
或者有没有办法断言我已经新建了这个对象?
只需使用ReferenceEquals
比较旧参考和新参考之间的参考。如果它们不同,则该属性已被替换。
var origInstance = this.ComplexInstance;
... // Some operation
Assert.False(object.ReferenceEquals(this.ComplexInstance, origInstance));
答案 1 :(得分:0)
在考虑了这一点后,我想出了一些不同的场景,以便更容易测试:
将ComplexType包装在工厂类方法中。我不喜欢这个b / c它只是意味着要创建一个类,我想避免拥有这么简单的工厂。
Extract and Override - 创建一个允许我删除具体依赖项的虚方法。如果您有任何疑问,请“提取并覆盖”Google。如果你不知道这种技术看起来很奇怪,我不喜欢这个b / c。
注入一个匿名函数,该函数返回该对象的新实例。
一位同事提到我也可以使用Mark Seeman的SemanticComparison将我的属性与一个新对象进行比较。
我最终选择了第三个选项,通过构造函数注入它,虽然我的IOC容器无法轻松解决它,我不得不花费几分钟时间尝试解决它的绑定问题。但我的工作做得很好。也许我应该刚刚创建工厂。但我很高兴我从班上取出了依赖。起初我不想b / c看起来很简单。