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();
}
Ich fange an, Moq zu benutzen und kämpfe ein bisschen. Ich versuche zu überprüfen, ob messageServiceClient den richtigen Parameter empfängt, nämlich ein XmlElement, aber ich kann keine Möglichkeit finden, dies zum Laufen zu bringen. Es funktioniert nur, wenn ich einen bestimmten Wert nicht überprüfe.
Irgendwelche Ideen?
Teilantwort: Ich habe einen Weg gefunden, um zu testen, ob die an den Proxy gesendete XML korrekt ist, aber ich denke immer noch nicht, dass dies der richtige Weg ist.
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());
}
Wie kann ich übrigens den Ausdruck aus dem Verify-Aufruf extrahieren?
quelle
Ich habe Anrufe auf die gleiche Weise überprüft - ich glaube, es ist der richtige Weg, dies zu tun.
Wenn Ihr Lambda-Ausdruck unhandlich wird, können Sie eine Funktion erstellen, die
MyObject
als Eingabe und Ausgabetrue
/false
...Beachten Sie auch einen Fehler bei Mock, bei dem in der Fehlermeldung angegeben wird, dass die Methode mehrmals aufgerufen wurde, wenn sie überhaupt nicht aufgerufen wurde. Möglicherweise haben sie das Problem inzwischen behoben. Wenn Sie diese Meldung sehen, sollten Sie möglicherweise überprüfen, ob die Methode tatsächlich aufgerufen wurde.
BEARBEITEN: Hier ist ein Beispiel für den mehrmaligen Aufruf von verify für Szenarien, in denen Sie überprüfen möchten, ob Sie beispielsweise für jedes Objekt in einer Liste eine Funktion aufrufen.
Gleicher Ansatz für die Einrichtung ...
Jedes Mal, wenn GetStuff für diese itemId aufgerufen wird, werden für dieses Item spezifische Daten zurückgegeben. Alternativ können Sie eine Funktion verwenden, die itemId als Eingabe verwendet und Daten zurückgibt.
Bei einer anderen Methode, die ich vor einiger Zeit in einem Blog gesehen habe (Phil Haack vielleicht?), Wurde das Setup von einem Dequeue-Objekt zurückgegeben. Jedes Mal, wenn die Funktion aufgerufen wurde, wurde ein Element aus einer Warteschlange gezogen.
quelle
Ein einfacherer Weg wäre:
quelle
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());
Ich glaube, dass das Problem in der Tatsache liegt, dass Moq auf Gleichheit prüfen wird. Da XmlElement Equals nicht überschreibt, wird bei seiner Implementierung die Referenzgleichheit überprüft.
Können Sie kein benutzerdefiniertes Objekt verwenden, um Gleiches zu überschreiben?
quelle
Hatte auch eine davon, aber der Parameter der Aktion war eine Schnittstelle ohne öffentliche Eigenschaften. Endete mit It.Is () mit einer separaten Methode und musste innerhalb dieser Methode einige Verspottungen der Schnittstelle durchführen
quelle