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();
}
Estoy empezando a usar Moq y estoy luchando un poco. Estoy tratando de verificar que messageServiceClient esté recibiendo el parámetro correcto, que es un XmlElement, pero no encuentro ninguna manera de hacerlo funcionar. Funciona solo cuando no verifico un valor en particular.
¿Algunas ideas?
Respuesta parcial: He encontrado una forma de probar que el xml enviado al proxy es correcto, pero todavía no creo que sea la forma correcta de hacerlo.
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());
}
Por cierto, ¿cómo podría extraer la expresión de la llamada Verificar?
fuente
He estado verificando llamadas de la misma manera: creo que es la forma correcta de hacerlo.
Si su expresión lambda se vuelve difícil de manejar, puede crear una función que tome
MyObject
como entrada y salidatrue
/false
...Además, tenga en cuenta un error con Mock donde el mensaje de error indica que el método se llamó varias veces cuando no se llamó en absoluto. Es posible que ya lo hayan solucionado, pero si ve ese mensaje, puede considerar verificar que realmente se haya llamado al método.
EDITAR: Aquí hay un ejemplo de verificación de llamadas múltiples veces para aquellos escenarios en los que desea verificar que llama a una función para cada objeto en una lista (por ejemplo).
El mismo enfoque para la configuración ...
Por lo tanto, cada vez que se llama a GetStuff para ese itemId, devolverá cosas específicas de ese elemento. Alternativamente, podría usar una función que tome itemId como entrada y devuelva cosas.
Otro método que vi en un blog hace algún tiempo (¿Phil Haack, tal vez?) Había configurado el regreso de algún tipo de objeto de cola: cada vez que se llamaba a la función, sacaba un elemento de una cola.
fuente
Una forma más simple sería hacer:
fuente
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());
Creo que el problema está en el hecho de que Moq verificará la igualdad. Y, dado que XmlElement no anula Equals, su implementación verificará la igualdad de referencia.
¿No puedes usar un objeto personalizado para anular iguales?
fuente
Tenía uno de estos también, pero el parámetro de la acción era una interfaz sin propiedades públicas. Terminé usando It.Is () con un método separado y dentro de este método tuve que hacer algunas burlas de la interfaz
fuente