Używanie Moq do próbkowania metody asynchronicznej dla testu jednostkowego
Testuję metodę usługi, która tworzy siećAPI
połączenie. Używanie normalnejHttpClient
działa dobrze dla testów jednostkowych, jeśli uruchomię także usługę WWW (zlokalizowaną w innym projekcie w rozwiązaniu) lokalnie.
Jednak po sprawdzeniu zmian serwer budowania nie będzie miał dostępu do usługi internetowej, więc testy się nie powiodą.
Wymyśliłem sposób na to, aby moje testy jednostkowe tworzyłyIHttpClient
interfejs i implementacja wersji, której używam w mojej aplikacji. W przypadku testów jednostkowych wykonuję próbną wersję uzupełnioną szyderczą metodą post asynchroniczną. Tutaj mam problemy. Chcę zwrócić OKHttpStatusResult
dla tego konkretnego testu. W kolejnym podobnym teście powrócę do złego wyniku.
Test zostanie uruchomiony, ale nigdy się nie zakończy. Wisi na oczekiwaniu. Jestem nowym użytkownikiem programowania asynchronicznego, delegatów i samego Moqa, a ja od pewnego czasu szukam SO i google, ucząc się nowych rzeczy, ale wciąż nie mogę pozbyć się tego problemu.
Oto metoda, którą próbuję przetestować:
public async Task<bool> QueueNotificationAsync(IHttpClient client, Email email)
{
// do stuff
try
{
// The test hangs here, never returning
HttpResponseMessage response = await client.PostAsync(uri, content);
// more logic here
}
// more stuff
}
Oto moja metoda testu jednostkowego:
[TestMethod]
public async Task QueueNotificationAsync_Completes_With_ValidEmail()
{
Email email = new Email()
{
FromAddress = "[email protected]",
ToAddress = "[email protected]",
CCAddress = "[email protected]",
BCCAddress = "[email protected]",
Subject = "Hello",
Body = "Hello World."
};
var mockClient = new Mock<IHttpClient>();
mockClient.Setup(c => c.PostAsync(
It.IsAny<Uri>(),
It.IsAny<HttpContent>()
)).Returns(() => new Task<HttpResponseMessage>(() => new HttpResponseMessage(System.Net.HttpStatusCode.OK)));
bool result = await _notificationRequestService.QueueNotificationAsync(mockClient.Object, email);
Assert.IsTrue(result, "Queue failed.");
}
Co ja robię źle?
Dziękuję za pomoc.