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();
}
Estou começando a usar o Moq e lutando um pouco. Estou tentando verificar se messageServiceClient está recebendo o parâmetro correto, que é um XmlElement, mas não consigo encontrar nenhuma maneira de fazê-lo funcionar. Funciona apenas quando não verifico um valor específico.
Alguma ideia?
Resposta parcial: Encontrei uma maneira de testar se o xml enviado ao proxy está correto, mas ainda não acho que seja a maneira correta de fazê-lo.
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());
}
A propósito, como eu poderia extrair a expressão da chamada Verificar?
fonte
Venho verificando as chamadas da mesma maneira - acredito que é a maneira correta de fazer isso.
Se sua expressão lambda se tornar pesada, você poderá criar uma função que assume
MyObject
como entrada e saídatrue
/false
...Além disso, esteja ciente de um bug no Mock, no qual a mensagem de erro informa que o método foi chamado várias vezes quando não foi chamado. Eles podem ter corrigido isso agora - mas se você vir essa mensagem, poderá verificar se o método foi realmente chamado.
EDIT: Aqui está um exemplo de chamada verificar várias vezes para os cenários em que você deseja verificar se você chama uma função para cada objeto em uma lista (por exemplo).
A mesma abordagem para a instalação ...
Portanto, toda vez que o GetStuff for chamado para esse itemId, ele retornará itens específicos para esse item. Como alternativa, você pode usar uma função que tome itemId como entrada e retorne itens.
Um outro método que eu vi em um blog algum tempo atrás (Phil Haack talvez?) Tinha a configuração retornando de algum tipo de objeto de desenfileiramento - cada vez que a função era chamada, ele puxava um item de uma fila.
fonte
Uma maneira mais simples seria fazer:
fonte
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());
Eu acredito que o problema no fato de que Moq irá verificar a igualdade. E, como XmlElement não substitui Equals, sua implementação verificará a igualdade de referência.
Você não pode usar um objeto personalizado para substituir os iguais?
fonte
Tinha um desses também, mas o parâmetro da ação era uma interface sem propriedades públicas. Acabou usando It.Is () com um método separado e, dentro desse método, foi necessário zombar da interface
fonte