激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - ASP.NET Core針對一個使用HttpClient對象的類編寫單元測試詳解

ASP.NET Core針對一個使用HttpClient對象的類編寫單元測試詳解

2020-06-06 16:24Lamond Lu ASP.NET教程

這篇文章主要給大家介紹了關于ASP.NET Core中如何針對一個使用HttpClient對象的類編寫單元測試的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習

介紹

幾年前,微軟引入了HttpClient類來替代HttpWebRequest來發送Web請求。這個新的類更易于使用,更加簡潔,更具有異步性,且易于擴展。

HttpClient類有一個可以接受HttpMessageHandler類對象的構造函數。HttpMessageHandler類對象可以接受一個請求(HttpRequestMessage), 并返回響應(HttpResponseMessage)。它的功能完全取決于它的實現。默認情況下HttpClient使用的是HttpClientHandler,HttpClientHandler是一個處理程序,它向網絡服務器發送請求并從服務器返回響應。在本篇博文中,我們將通過繼承DelegatingHandler來創建自己的HttpMessageHandler。

為了實現以上功能,HttpClient對象不可以直接使用,而是需要與允許使用IHttpClientFactory接口進行模擬的依賴注入一起使用。

讓我們來偽造一個HttpMessageHandler

下面的例子中,我們只討論HttpResponseMessage, 不會處理HttpRequestMessage。

以下是我偽造的一個HttpMessageHandler對象。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FakeHttpMessageHandler : DelegatingHandler
{
 private HttpResponseMessage _fakeResponse;
 
 public FakeHttpMessageHandler(HttpResponseMessage responseMessage)
 {
  _fakeResponse = responseMessage;
 }
 
 protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
 {
  return await Task.FromResult(_fakeResponse);
 }
}

這里我添加了一個需要HttpResponseMessage構造函數,然后復寫了SendAsync方法, 在該方法中直接返回了構造函數中傳入的HttpResponseMessage對象。

編寫一個使用IHttpClientFactory接口的服務

下面我們需要編寫一個UserService類,這個類提供了一個GetUsers方法,來從遠程服務器端獲取用戶列表。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class UserService
{
 private readonly IHttpClientFactory _httpFactory;
 
 public UserService(IHttpClientFactory httpFactory)
 {
  _httpFactory = httpFactory;
 }
 
 public async Task<List<User>> GetUsers(string url)
 {
  using (HttpClient httpclient = _httpFactory.CreateClient())
  {
   using (HttpResponseMessage response = await httpclient.GetAsync(url))
   {
    if (response.StatusCode == HttpStatusCode.OK)
    {
     List<User> users = await response.Content.ReadAsAsync<List<User>>();
     return users;
    }
    return null;
   }
  }
 }
}

以下是Api請求返回的用戶類

?
1
2
3
4
5
public class User
{
 public string FirstName { get; set; }
 public string LastName { get; set; }
}

如你所見,使用HttpClientFactory允許我們模擬HttpClient實例化

測試服務

在下面的單元測試中,我們會使用XUnit、FluentAssertion、NSubstitute

測試場景1: 模擬一個請求,返回2個用戶

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class UserServiceTests
{
  [Fact]
  public async Task WhenACorrectUrlIsProvided_ServiceShouldReturnAlistOfUsers()
  {
    // Arrange
    var users = new List<User>
    {
     new User
     {
       FirstName = "John",
       LastName = "Doe"
     },
     new User
     {
       FirstName = "John",
       LastName = "Deere"
     }
    };
 
    var httpClientFactoryMock = Substitute.For<IHttpClientFactory>();
    var url = "http://good.uri";
    var fakeHttpMessageHandler = new FakeHttpMessageHandler(new HttpResponseMessage() {
     StatusCode = HttpStatusCode.OK,
     Content = new StringContent(JsonConvert.SerializeObject(users), Encoding.UTF8, "application/json")
    });
    var fakeHttpClient = new HttpClient(fakeHttpMessageHandler);
 
    httpClientFactoryMock.CreateClient().Returns(fakeHttpClient);
 
    // Act
    var service = new UserService(httpClientFactoryMock);
    var result = await service.GetUsers(url);
 
   // Assert
   result
   .Should()
   .BeOfType<List<User>>()
   .And
   .HaveCount(2)
   .And
   .Contain(x => x.FirstName == "John")
   .And
   .Contain(x => x.LastName == "Deere")
   .And
   .Contain(x => x.LastName == "Doe");
  }
}
  • 在以上測試中,我們期望獲取一個成功的響應,并得到2個用戶的信息。
  • 我們期望從Service中得到的數據是JSON格式的。
  • 我們使用一個偽造的處理程序初始化了一個HttpClient對象,然后定義了我們期望的得到的偽造對象httpClientFactoryMock.CreateClient().Returns(fakeHttpClient);

測試場景2: 模擬一個404錯誤,返回空數據

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class UserServiceTests
{
  [Fact]
  public async Task WhenABadUrlIsProvided_ServiceShouldReturnNull()
  {
    // Arrange
    var httpClientFactoryMock = Substitute.For<IHttpClientFactory>();
    var url = "http://bad.uri";
    var fakeHttpMessageHandler = new FakeHttpMessageHandler(new HttpResponseMessage() {
     StatusCode = HttpStatusCode.NotFound
    });
    var fakeHttpClient = new HttpClient(fakeHttpMessageHandler);
 
    httpClientFactoryMock.CreateClient().Returns(fakeHttpClient);
 
    // Act
    var service = new UserService(httpClientFactoryMock);
    var result = await service.GetUsers(url);
 
   // Assert
   result
   .Should()
   .BeNullOrEmpty();
  }
}

和測試場景1類似,當一個Http請求返回Not Found, 它的結果集是Null

總結

本篇作者講解了在ASP.NET Core中如何偽造HttpClient來測試持有HttpClient對象的類。這里主要是通過偽造的DelegatingHandler對象來創建一個HttpClient對象,并使用IHttpClientFactory來獲取偽造的HttpClient來達到目的。

本篇源代碼:https://github.com/lamondlu/Sample_TestHttpClient 

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文地址: How to unit test a class that consumes an HttpClient with IHttpClientFactory in ASP.NET Core?

作者: Anthony Giretti

原文鏈接:https://www.cnblogs.com/lwqlun/p/10215929.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 羞羞的视频在线 | 精品国产一区二区三区四 | 国产成人视屏 | 日日狠狠久久偷偷四色综合免费 | 午夜色片 | 康妮卡特欧美精品一区 | 欧洲性xxxxx| 福利免费观看 | 91懂色| 亚洲成人午夜精品 | 国产一有一级毛片视频 | 精品国产一区二区三区久久久蜜 | 黄色av免费电影 | 亚洲资源在线 | 视频一区免费观看 | 精品一区二区三区网站 | 国产久草视频在线 | 国产精品呻吟 | 毛片网站视频 | 男女做性免费网站 | 日本欧美一区二区三区在线观看 | 免费香蕉成视频成人网 | 国产精品欧美日韩一区二区 | 亚洲天堂男人 | 羞羞羞网站 | 人禽l交免费视频 | 姑娘第5集高清在线观看 | 精品国产96亚洲一区二区三区 | 日韩精品一二三 | 国产免费看片 | 男女污视频在线观看 | 黑人一级片视频 | 成人福利视频在 | 九九热视频在线免费观看 | 黄 色 免费网 站 成 人 | 国产在线一级视频 | 精品999www | 天天碰夜夜操 | 国内一区 | 久久久久久久久久久久久久久伊免 | 毛片免 |