簡體   English   中英

使用 Moq 測試 HttpClient RequestClientCredentialsTokenAsync

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

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