使用It.IsAny ()的Moqunit testing失败

我正在使用Moq为项目编写unit testing,当我尝试validationDateTime属性是否被赋值时,其中一个测试失败。 这是我的validation(失败):

_mockTaskContext.Verify(context => context.TaskQueue.AddObject(It.Is( task_queue => task_queue.TaskCode == (int)TaskCode.MyTask && task_queue.ClientID == ExpectedClientID && task_queue.JobNumber == It.IsAny() && task_queue.Requester == String.Empty && task_queue.JobStatus == (int)JobStatus.Submitted && task_queue.TimeQueued == It.IsAny() && task_queue.TimeStarted == new DateTime(1900, 1, 1) && task_queue.TimeStopped == new DateTime(1900, 1, 1) && task_queue.TaskParameters == expectedTaskParam )), Times.Once()); 

如果我在task_queue.TimeQueued上注释掉期望值,则测试通过,而不对我的测试进行任何其他更改。 此外,如果我将TimeStartedTimeStopped的要求new DateTime(1900, 1, 1) It.IsAny() new DateTime(1900, 1, 1)更改为It.IsAny() ,则测试失败。 我使用实际的实现而不是TimeQueued存储库运行unit testing之外的测试代码,并正确地为TimeQueued分配其值。 知道为什么It.IsAny似乎没有正确使用DateTime属性,或者我是否错误地设置了我的期望?

更新:我在其他测试中使用It.IsAny()没有任何问题,但此测试仍然失败。 我想这可能是因为这是在It.Is lambda表达式中,但我不知道如何解决这个问题。

我确信必须在mock对象的范围内使用It.IsAny<>()语法。 在这种情况下,直接使用Setup和模拟参数。 这是因为模拟对象处于记录模式,捕获您传递给参数的值

 mock.Setup(x => x.Foo(It.IsAny())); 

将在执行“设置”行时处理参数。

但是在您的示例中,您尝试在委托中使用It.IsAny<>()来validation匹配中传递的参数。 当发生这种情况时,模拟器不会记录,而是在被测对象(后来更晚)的结果中使用。

因此, someValue == It.IsAny()无法求值为true,因为IsAny方法的返回必须返回匹配值才能为true。 我希望It.IsAny()也不起作用。

我的建议是你必须匹配精确的值,或者在这种情况下匹配一系列日期

 && IsInRange(DateTime.MinValue, DateTime.MaxValue, task_queue.TimeQueued) 

其中IsInRange只是另一种检查值的方法是在2分钟和最大边界之间。