簡體   English   中英

如何在 .NET 中為類型化客戶端編寫集成測試

[英]How to write integration test for typed client in .NET

我有一個 .NET 7 控制台應用程序,它從 API 獲取數據。

控制台應用程序很簡單,使用我正在編寫的“類型化客戶端”:

services.AddSingleton<IMyTypedClient, MyTypedClient>();
services.AddHttpClient<IMyTypedClient, MyTypedClient>(client =>
    {
        client.BaseAddress = new Uri("http://www.randomnumberapi.com/api/v1.0/");
    })
    .SetHandlerLifetime(TimeSpan.FromMinutes(5))
    .AddPolicyHandler(GetRetryPolicy());

static IAsyncPolicy<HttpResponseMessage> GetRetryPolicy()
{
    return HttpPolicyExtensions
        .HandleTransientHttpError()
        .OrResult(msg => msg.StatusCode == System.Net.HttpStatusCode.NotFound)
        .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));
}

這是“鍵入的客戶端”:

public class MyTypedClient : IMyTypedClient
{
    private readonly HttpClient _httpClient;

    public MyTypedClient(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public void GetRandomNumber()
    {
        var response = _httpClient.GetAsync("/random?min=1&max=10&count=5").Result;
        if (response.StatusCode != HttpStatusCode.OK)
        {
            throw new Exception("Failed to get random number");
        }
    }
}

上面的代碼是受MS 文檔的啟發。

問題我想集成測試我在開發應用程序時編寫的應用程序的“類型化客戶端”部分,但是如何為這個采用HttpClient的類型化客戶端創建集成測試?

如果你想“只是”測試“類型化的客戶端”,你不應該在測試期間將它連接到外部服務。 在這種情況下,您必須為 HttpClient 提供模擬,並在測試期間注入它。 這個模擬必須返回可預測的結果。

如果您確實想使用外部服務,測試會變得非常脆弱,因為您無法預測並檢查結果是否正確。

在這兩種情況下,測試都會很困難,因為類型化的客戶端不返回任何內容,這使得無法檢查結果。

我最終只是在我的“測試”夾具中執行了以下輔助方法:

    const string baseUrl = "https://someurl";
    const string accessToken = "token";

    var httpClient = new HttpClient
    {
        BaseAddress = new Uri(baseUrl)
    };


    return new MyTypedClient(httpClient, accessToken);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM