[英]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.