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.

questionAnswers(1)

yourAnswerToTheQuestion