![](/img/trans.png)
[英]Moq converts It.IsAny<Exception> to It.IsAny<string> in expectation
[英]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
的期望,则测试将通过,而无需对测试进行任何其他更改。 另外,如果我将对TimeStarted
或TimeStopped
的要求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.