public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
var messageServiceClientMock = new Mock<IMessageServiceClient>();
var queueableMessage = CreateSingleQueueableMessage();
var message = queueableMessage[0];
var xml = QueueableMessageAsXml(queueableMessage);
messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(xml)).Verifiable();
//messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();
var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(essageServiceClientMock.Object);
var loggerStub = new Mock<ILogger>();
var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object);
client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message});
//messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(xml), Times.Once());
messageServiceClientMock.Verify();
}
Я начинаю использовать Moq и немного борюсь. Я пытаюсь проверить, что messageServiceClient получает правильный параметр, который является XmlElement, но я не могу найти способ заставить его работать. Это работает только тогда, когда я не проверяю конкретное значение.
Любые идеи?
Частичный ответ: я нашел способ проверить, что xml, отправленный на прокси, правильный, но я все еще не думаю, что это правильный способ сделать это.
public void SubmitMessagesToQueue_OneMessage_SubmitSuccessfully()
{
var messageServiceClientMock = new Mock<IMessageServiceClient>();
messageServiceClientMock.Setup(proxy => proxy.SubmitMessage(It.IsAny<XmlElement>())).Verifiable();
var serviceProxyFactoryStub = new Mock<IMessageServiceClientFactory>();
serviceProxyFactoryStub.Setup(proxyFactory => proxyFactory.CreateProxy()).Returns(messageServiceClientMock.Object);
var loggerStub = new Mock<ILogger>();
var client = new MessageClient(serviceProxyFactoryStub.Object, loggerStub.Object);
var message = CreateMessage();
client.SubmitMessagesToQueue(new List<IMessageRequestDTO> {message});
messageServiceClientMock.Verify(proxy => proxy.SubmitMessage(It.Is<XmlElement>(xmlElement => XMLDeserializer<QueueableMessage>.Deserialize(xmlElement).Messages.Contains(message))), Times.Once());
}
Кстати, как я мог извлечь выражение из вызова Verify?
источник
Я проверял звонки таким же образом - я считаю, что это правильный способ сделать это.
Если ваше лямбда-выражение становится громоздким, вы могли бы создать функцию, которая принимает в
MyObject
качестве входных данных и выводитtrue
/false
...Также следует помнить об ошибке в Mock, когда в сообщении об ошибке говорится, что метод вызывался несколько раз, когда он вообще не вызывался. Возможно, они уже исправили это, но если вы видите это сообщение, вы можете проверить, действительно ли был вызван метод.
РЕДАКТИРОВАТЬ: Вот пример вызова проверки несколько раз для тех сценариев, где вы хотите убедиться, что вы вызываете функцию для каждого объекта в списке (например).
Тот же подход для настройки ...
Таким образом, каждый раз, когда GetStuff вызывается для этого itemId, он возвращает материал, специфичный для этого элемента. Кроме того, вы можете использовать функцию, которая принимает itemId в качестве входных данных и возвращает вещи.
Еще один метод, который я видел в блоге некоторое время назад (возможно, Фил Хаак?), Имел настройку, возвращающуюся из какого-либо объекта dequeue - каждый раз, когда вызывается функция, она вытягивает элемент из очереди.
источник
Более простым способом было бы сделать:
источник
m.Setup(x => x.CreateSR(Code.WRDD)).ReturnsAsync(0); await ClassUnderTest.CompleteCC(accountKey, It.IsAny<int>(), mockRequest); m.Verify(x => x.CreateSR(It.Is<Code>(p => p == Code.WRCC)), Times.Once());
Я считаю, что проблема в том, что Moq проверит на равенство. И, поскольку XmlElement не переопределяет Equals, его реализация проверяет равенство ссылок.
Разве вы не можете использовать пользовательский объект, так что вы можете переопределить равно?
источник
Был и один из них, но параметром действия был интерфейс без открытых свойств. Закончилось использованием It.Is () с отдельным методом, и в рамках этого метода пришлось сделать некоторые насмешки над интерфейсом
источник