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();
}
Je commence à utiliser Moq et j'ai un peu de mal. J'essaie de vérifier que messageServiceClient reçoit le bon paramètre, qui est un XmlElement, mais je ne trouve aucun moyen de le faire fonctionner. Cela ne fonctionne que lorsque je ne vérifie pas une valeur particulière.
Des idées?
Réponse partielle: j'ai trouvé un moyen de tester que le XML envoyé au proxy est correct, mais je ne pense toujours pas que ce soit la bonne façon de le faire.
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());
}
À propos, comment pourrais-je extraire l'expression de l'appel de vérification?
la source
J'ai vérifié les appels de la même manière - je pense que c'est la bonne façon de le faire.
Si votre expression lambda devient peu maniable, vous pouvez créer une fonction qui prend
MyObject
comme entrée et sortiestrue
/false
...Aussi, soyez conscient d'un bogue avec Mock où le message d'erreur indique que la méthode a été appelée plusieurs fois alors qu'elle ne l'était pas du tout. Ils l'ont peut-être déjà résolu - mais si vous voyez ce message, vous pouvez envisager de vérifier que la méthode a été effectivement appelée.
EDIT: Voici un exemple d'appels à verify plusieurs fois pour les scénarios où vous souhaitez vérifier que vous appelez une fonction pour chaque objet d'une liste (par exemple).
Même approche pour la configuration ...
Ainsi, chaque fois que GetStuff est appelé pour cet itemId, il renverra des éléments spécifiques à cet élément. Vous pouvez également utiliser une fonction qui prend itemId comme entrée et renvoie des éléments.
Une autre méthode que j'ai vue sur un blog il y a quelque temps (Phil Haack peut-être?) Avait une configuration retournant d'une sorte d'objet de file d'attente - chaque fois que la fonction était appelée, elle tirait un élément d'une file d'attente.
la source
Une manière plus simple serait de faire:
la source
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());
Je pense que le problème réside dans le fait que Moq vérifiera l'égalité. Et, étant donné que XmlElement ne remplace pas Equals, son implémentation vérifiera l'égalité des références.
Ne pouvez-vous pas utiliser un objet personnalisé pour pouvoir remplacer les égaux?
la source
Il y en avait aussi un, mais le paramètre de l'action était une interface sans propriétés publiques. J'ai fini par utiliser It.Is () avec une méthode distincte et dans cette méthode a dû se moquer de l'interface
la source