相信大伙儿针对在ASP.NET Core里怎样令其用HttpClient为目标的类撰写模块检测很很感兴趣,在此一篇文章中大家详尽的将实例、流程、全过程都一步一步的纪录在此,期待你看看到本文可以有一定的获得。
两年前,微软公司引进了HttpClient类来取代HttpWebRequest来推送Web恳求。这一新的类更加容易于应用,更为简约,更具有有多线程性,且便于拓展。 HttpClient类有一个能够接纳HttpMessageHandler类目标的结构涵数。HttpMessageHandler类目标能够接纳一个恳求(HttpRequestMessage), 并回到响应(HttpResponseMessage)。它的作用彻底在于它的完成。默认设置状况下HttpClient应用的是HttpClientHandler,HttpClientHandler是一个解决程序,它向互联网网络服务器推送恳求并从网络服务器回到响应。在这篇博闻中,大家将根据承继DelegatingHandler来建立自身的HttpMessageHandler。 以便完成之上作用,HttpClient目标不能以立即应用,只是必须与容许应用IHttpClientFactory插口开展仿真模拟的依靠引入一起应用。 要我们来仿冒一个HttpMessageHandler 下边的事例中,大家只探讨HttpResponseMessage, 不容易解决HttpRequestMessage。 下列就是我仿冒的一个HttpMessageHandler目标。 public class FakeHttpMessageHandler : DelegatingHandler { private HttpResponseMessage _fakeResponse; public FakeHttpMessageHandler(HttpResponseMessage responseMessage) { _fakeResponse = responseMessage; } protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { return await Task.FromResult(_fakeResponse); } } 这儿我加上了一个必须HttpResponseMessage结构涵数,随后复写了SendAsync方式, 在该方式中立即回到了结构涵数中国传媒大学入的HttpResponseMessage目标。 撰写一个应用IHttpClientFactory插口的服务 下边大家必须撰写一个UserService类,这一类出示了一个GetUsers方式,来从远程控制网络服务器端获得客户目录。 public class UserService { private readonly IHttpClientFactory _httpFactory; public UserService(IHttpClientFactory httpFactory) { _httpFactory = httpFactory; } public async Task GetUsers(string url) { using (HttpClient httpclient = _httpFactory.CreateClient()) { using (HttpResponseMessage response = await httpclient.GetAsync(url)) { if (response.StatusCode == HttpStatusCode.OK) { List users = await response.Content.ReadAsAsync return users; } return null; } } } } 下列是Api恳求回到的客户类 public class User { public string FirstName { get; set; } public string LastName { get; set; } } 如你所闻,应用HttpClientFactory容许大家仿真模拟HttpClient案例化 检测服务 在下边的模块检测中,大家会应用XUnit、FluentAssertion、NSubstitute 检测情景1: 仿真模拟一个恳求,回到两个客户 public class UserServiceTests { [Fact] public async Task WhenACorrectUrlIsProvided_ServiceShouldReturnAlistOfUsers() { // Arrange var users = new List { new User { FirstName = John , LastName = Doe }, new User { FirstName = John , LastName = Deere } }; var httpClientFactoryMock = Substitute.For(); var url = p> 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 () .And .HaveCount(2) .And .Contain(x = x.FirstName == John ) .And .Contain(x = x.LastName == Deere ) .And .Contain(x = x.LastName == Doe } } 在之上检测中,大家期待获得一个取得成功的响应,并获得两个客户的信息内容。 大家期待从Service中获得的数据信息是JSON文件格式的。 大家应用一个仿冒的解决程序原始化了一个HttpClient目标,随后界定了大家期待的获得的仿冒目标httpClientFactoryMock.CreateClient().Returns(fakeHttpClient); 检测情景2: 仿真模拟一个404不正确,回到空数据信息 public class UserServiceTests { [Fact] public async Task WhenABadUrlIsProvided_ServiceShouldReturnNull() { // Arrange var httpClientFactoryMock = Substitute.For(); var url = p> 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 不知道道你看看完以后有什么感受呢?有木有获得到甚么新的专业知识,自身的实际操作是不是也进行了呢?期待大伙儿之后也多多的适用大家网站,这儿有很多丰富多彩的新闻资讯,给你大饱眼福哦。 (责任编辑:admin) |