Модульный тест Moq с It.IsAny <DateTime>() не проходит - PullRequest
2 голосов
/ 28 марта 2011

Я использую 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>(), тест не пройден. Я запускал тестируемый код вне модульного теста с реальной реализацией вместо смоделированного репозитория, и TimeQueued правильно присваивается его значение. Любая идея, почему It.IsAny не работает правильно для DateTime свойств, или я неправильно устанавливаю свои ожидания?

Обновление: я использую It.IsAny () в других тестах без каких-либо проблем, но этот тест все еще не проходит. Я думаю, это может быть из-за того, что это внутри лямбда-выражения It.Is, но я не знаю, как бы обойти это.

1 Ответ

7 голосов
/ 30 марта 2011

Я уверен, что синтаксис It.IsAny<>() должен использоваться в рамках фиктивного объекта. В этом случае, когда вы используете Setup и фиктивные аргументы напрямую. Это потому, что фиктивный объект находится в режиме записи, собирая значения, которые вы передаете в аргументы, так что

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

будет обрабатывать аргументы при выполнении строки установки.

Однако в вашем примере вы пытаетесь использовать It.IsAny<>() из делегата для проверки аргумента, переданного в совпадениях. Когда это происходит, имитация не записи, а в процессе использования в результате тестируемого объекта (что намного позже).

Таким образом, someValue == It.IsAny<DateTime>() не может получить значение true, поскольку возвращение метода IsAny должно возвращать совпадающее значение, чтобы оно было истинным. Я ожидаю, что It.IsAny<int>() также не работает.

Мое предложение заключается в том, что вам нужно будет либо указать точные значения, либо в этом случае сопоставить диапазон дат

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

, где IsInRange просто еще один метод проверки значения между 2 мин и макс. Границами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...