.net 在两个对象上Assert.AreEqual,但忽略DateTime属性

.net 在两个对象上Assert.AreEqual,但忽略DateTime属性,.net,unit-testing,.net,Unit Testing,我有一个单元测试,其中我模拟了一些东西的结果,这些东西有一个DateTime属性,该属性是在我执行操作时设置的——一个“CreatedOn”属性。由于我无法创建结果并同时执行操作,因此Assert.AreEqual总是失败。如何测试我的两个对象除了某些日期时间字段外是否相同?这里有两个选项: 在创建时间之后更改CreatedOn,使属性匹配。考虑到您的API,这可能是可能的,也可能是不可能的 创建一个检查所有其他属性的方法,但忽略CreatedOn属性。就用这个吧。这实际上只是多个Assert.

我有一个单元测试,其中我模拟了一些东西的结果,这些东西有一个DateTime属性,该属性是在我执行操作时设置的——一个“CreatedOn”属性。由于我无法创建结果并同时执行操作,因此Assert.AreEqual总是失败。如何测试我的两个对象除了某些日期时间字段外是否相同?

这里有两个选项:

  • 在创建时间之后更改
    CreatedOn
    ,使属性匹配。考虑到您的API,这可能是可能的,也可能是不可能的
  • 创建一个检查所有其他属性的方法,但忽略
    CreatedOn
    属性。就用这个吧。这实际上只是多个
    Assert.AreEqual
    调用,而是针对单个属性,而不仅仅是整个对象

  • 我通常会做以下事情之一:

    • 您可以为SUT创建TimeProvider依赖项,并使用该提供程序获取当前日期。这将允许您设置任何当前日期
    • 若您正在比较的对象是由其中一个SUT依赖项返回的,那个么您可以设置模拟依赖项以返回与您在测试中检查的对象实例完全相同的对象实例

    能否显示您的测试方法代码?我认为,如果您模拟某个内容的结果,那么您可以提供任何返回值,以及任何CreatedOn属性值。这听起来像是最健壮的解决方案,但会使实现过于复杂。@rushonerok不幸的是,在真正的单元测试中,您应该模拟所有外部资源(数据库、文件等)而且当前时间也是配置文件的外部资源,所以是的,它应该是模拟的:)这听起来像是最简单的解决方案,但没有那么健壮。我想我可能会暂时这样做,直到我找到一个简单而可靠的方法。