[英]Using Moq to test HttpClient RequestClientCredentialsTokenAsync
我正在嘗試模擬使用 IdentityModel 擴展請求客戶端憑據令牌的 Http 客戶端。
var tokenResponse = await _httpClient.RequestClientCredentialsTokenAsync(requestContent);
我開始進行設置:
var httpClient = new Mock<HttpClient>();
var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = JsonContent.Create(new
{
access_token = "token",
expires_in = 5000
})
};
var tokenResponse = ProtocolResponse.FromHttpResponseAsync<TokenResponse>(httpResponseMessage);
httpClient.Setup(x => x.RequestClientCredentialsTokenAsync(It.IsAny<ClientCredentialsTokenRequest>(), It.IsAny<CancellationToken>())).Returns(tokenResponse);
但我最終得到:
System.NotSupportedException:不支持的表達式:x => x.RequestClientCredentialsTokenAsync(It.IsAny(), It.IsAny()) 擴展方法(此處:HttpClientTokenRequestExtensions.RequestClientCredentialsTokenAsync)不能用於設置/驗證表達式。
我如何模擬RequestClientCredentialsTokenAsync
擴展?
查看 RequestClientCredentialsTokenAsync 的內部結構,我們可以看到它使用的基本請求是 SendAsync,因此我們需要模擬 SendAsync。
分機呼叫:
response = await client.SendAsync(request, cancellationToken).ConfigureAwait();
最終設置:
var httpClient = new Mock<HttpClient>();
var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = JsonContent.Create(new
{
access_token = "token",
expires_in = 5000
})
};
httpClient.Setup(x => x.SendAsync(It.IsAny<HttpRequestMessage>(), It.IsAny<CancellationToken>())).Returns(Task.FromResult(httpResponseMessage));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.