Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何测试对象的新实例是否已创建?_C#_Unit Testing_Xunit - Fatal编程技术网

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

C# 如何测试对象的新实例是否已创建?,c#,unit-testing,xunit,C#,Unit Testing,Xunit,我使用C#、xUnit和Moq进行单元测试。我有一个具有复杂类型属性的对象。要“清除”属性及其所有属性,我执行以下操作: this.ComplexTypeInstance = new ComplexType(); 现在我试图断言ComplexTypeInstance已分配给一个全新的对象。我的第一个想法是将ComplexTypeInstance与新的ComplexType()进行比较,看看它们是否相等。但是要做这样的事情,我想我必须重写equals操作符。有没有办法轻松检查所有属性是否都设置为

我使用C#、xUnit和Moq进行单元测试。我有一个具有复杂类型属性的对象。要“清除”属性及其所有属性,我执行以下操作:

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

或者有没有一种方法可以断言我已经更新了对象

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

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

仔细考虑后,我提出了几个不同的方案,使测试更容易:

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

  • 提取和重写-创建一个虚拟方法,允许我删除具体的依赖项。如果你有问题,谷歌“提取并覆盖”。我不喜欢这个b/c,如果你不知道它的技术,它可能看起来很奇怪

  • 注入一个匿名函数,返回对象的新实例

  • 一位同事提到,我也可以使用MarkSeeman的语义比较将我的属性与一个新对象进行比较

  • 我最终选择了第三个选项,通过构造函数注入它,尽管我的IOC容器无法轻松解析它,我不得不花几分钟的时间让它解析它的绑定。但我让它工作得很好。也许我应该创建一个工厂。但我很高兴我从课堂上去掉了依赖性。起初我不想用信用证付款,因为它看起来很简单