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();
}
Zaczynam używać Moq i trochę się zmagam. Próbuję sprawdzić, czy messageServiceClient odbiera właściwy parametr, którym jest XmlElement, ale nie mogę znaleźć żadnego sposobu, aby to zadziałało. Działa tylko wtedy, gdy nie sprawdzam określonej wartości.
Jakieś pomysły?
Częściowa odpowiedź: znalazłem sposób, aby sprawdzić, czy plik XML wysłany do serwera proxy jest poprawny, ale nadal uważam, że nie jest to właściwy sposób.
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());
}
Przy okazji, jak mogę wyodrębnić wyrażenie z wywołania Verify?
źródło
Weryfikowałem połączenia w ten sam sposób - uważam, że to właściwy sposób.
Jeśli twoje wyrażenie lambda stanie się nieporęczne, możesz utworzyć funkcję, która przyjmuje
MyObject
jako dane wejściowe i wyjściowetrue
/false
...Należy również pamiętać o błędzie w Mock, w którym komunikat o błędzie informuje, że metoda została wywołana wiele razy, gdy w ogóle nie została wywołana. Być może już to naprawili - ale jeśli zobaczysz ten komunikat, możesz rozważyć sprawdzenie, czy metoda została faktycznie wywołana.
EDYCJA: Oto przykład wielokrotnego wywoływania weryfikacji dla tych scenariuszy, w których chcesz sprawdzić, czy wywołujesz funkcję dla każdego obiektu na liście (na przykład).
To samo podejście do konfiguracji ...
Więc za każdym razem, gdy GetStuff zostanie wywołany dla tego itemId, zwróci rzeczy specyficzne dla tego elementu. Alternatywnie, możesz użyć funkcji, która pobiera itemId jako dane wejściowe i zwraca rzeczy.
Inna metoda, którą widziałem na blogu jakiś czas temu (być może Phil Haack?), Polegała na konfiguracji zwracania z jakiegoś rodzaju obiektu usuwanego z kolejki - za każdym razem, gdy funkcja była wywoływana, ściągał element z kolejki.
źródło
Prostszym sposobem byłoby:
źródło
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());
Uważam, że problem polega na tym, że Moq sprawdzi równość. A ponieważ XmlElement nie zastępuje Equals, jego implementacja sprawdzi równość odwołań.
Nie możesz użyć niestandardowego obiektu, aby zastąpić równa się?
źródło
Miał też jeden z nich, ale parametrem akcji był interfejs bez właściwości publicznych. Skończyło się na użyciu It.Is () z oddzielną metodą iw ramach tej metody musiałem zrobić trochę kpiny z interfejsu
źródło