繁体   English   中英

使用It.IsAny进行Moq单元测试 <DateTime> ()失败

[英]Moq unit test with It.IsAny<DateTime>() fails

我使用Moq编写项目的单元测试,当我尝试验证是否为DateTime属性分配了值时,其中一个测试失败。 这是我的验证(失败):

        _mockTaskContext.Verify(context => context.TaskQueue.AddObject(It.Is<TaskQueueItem>(
            task_queue => task_queue.TaskCode == (int)TaskCode.MyTask
                    && task_queue.ClientID == ExpectedClientID
                    && task_queue.JobNumber == It.IsAny<int>()
                    && task_queue.Requester == String.Empty
                    && task_queue.JobStatus == (int)JobStatus.Submitted
                    && task_queue.TimeQueued == It.IsAny<DateTime>()
                    && 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<DateTime>() new DateTime(1900, 1, 1)更改为It.IsAny<DateTime>() ,则测试将失败。 我已经使用实际的实现而不是TimeQueued存储库在单元测试之外运行了测试下的代码,并且TimeQueued被正确分配了其值。 知道为什么It.IsAny对于DateTime属性似乎无法正常工作,还是我的期望设置不正确?

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

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

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

执行Setup行时将处理参数。

但是,在您的示例中,您尝试在委托中使用It.IsAny<>()来验证在匹配项中传递的参数。 发生这种情况时,模拟不会录制,而是作为被测试对象的结果使用(这要晚得多)。

所以someValue == It.IsAny<DateTime>()不能评估为true,因为IsAny方法的返回必须返回一个匹配值才能使其为true。 我希望It.IsAny<int>()也不起作用。

我的建议是您必须匹配精确值,或者在这种情况下匹配日期范围

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

IsInRange只是您用于检查值的另一种方法,介于2 min和max bounds之间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM