我正在使用 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
然后测试通过,无需对我的测试进行任何其他更改。另外,如果我更改任一要求TimeStarted
or TimeStopped
from new DateTime(1900, 1, 1)
to It.IsAny<DateTime>()
,测试失败。我已经使用实际实现而不是模拟存储库在单元测试之外运行了测试代码,并且TimeQueued
正在被正确分配其值。知道为什么吗It.IsAny
似乎无法正常工作DateTime
属性,还是我错误地设置了我的期望?
更新:我在其他测试中使用 It.IsAny() 没有任何问题,但这个测试仍然失败。我认为这可能是因为这是在 It.Is lambda 表达式内部,但我不知道如何解决这个问题。
我确信It.IsAny<>()
语法必须在模拟对象的范围内使用。在这种情况下,当您使用Setup
和直接模拟参数。这是因为模拟对象处于记录模式,捕获您传递给参数的值,因此
mock.Setup(x => x.Foo(It.IsAny<Bar>()));
将在执行安装行时处理参数。
但是在您的示例中您尝试使用It.IsAny<>()
从委托内部验证匹配中传递的参数。当发生这种情况时,模拟不会记录,而是正在被用作被测试对象的结果(这是很晚的事情)。
So someValue == It.IsAny<DateTime>()
无法评估为 true 作为返回IsAny
方法必须返回一个匹配的值才能为 true。我预计It.IsAny<int>()
也不起作用。
我的建议是,您必须匹配精确值,或者在本例中匹配一系列日期
&& IsInRange(DateTime.MinValue, DateTime.MaxValue, task_queue.TimeQueued)
where IsInRange
您可以使用另一种方法来检查值是否在 2 分钟和最大范围之间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)