• 体彩天下官网

  • 体彩天下官网

  • 体彩天下官网

  • 体彩天下官网

体彩天下官网

作(zuo)者︰wy  發布日期︰2020-02-18 11:56:00
  •   我相信(xin)大(da)家對于(yu)在(zai)ASP.NET Core里如何以使用HttpClient為對象的(de)類(lei)編寫單元測(ce)試很感興趣,在(zai)此(ci)si) 惱輪形頤竅 xi)的(de)將案例、步驟、過(guo)程都一步一步的(de)記(ji)錄在(zai)此(ci),希望你看到這(zhe)篇文章能夠有所收獲(huo)。

      幾(ji)年前,微軟引入(ru)了(liao)HttpClient類(lei)來替代(dai)HttpWebRequest來發送(song)Web請求。這(zhe)個新的(de)類(lei)更(geng)易于(yu)使用,更(geng)加簡潔,更(geng)具有異步性,且易于(yu)擴展。

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

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

      讓我們來偽造(zao)一個HttpMessageHandler

      下面xian)睦又校 頤侵惶tao)論(lun)HttpResponseMessage, 不會處(chu)理HttpRequestMessage。

      以下是我偽造(zao)的(de)一個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);

      }

      }

      這(zhe)里我添加了(liao)一個需要HttpResponseMessage構造(zao)函數,然後(hou)復寫了(liao)SendAsync方法, 在(zai)該方法中直接返回了(liao)構造(zao)函數中傳入(ru)的(de)HttpResponseMessage對象。

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

    ASP.NET

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

      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請求返回的(de)用戶類(lei)

      public class User

      {

      public string FirstName { get; set; }

      public string LastName { get; set; }

      }

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

      測(ce)試服務

      在(zai)下面xian)牡? ce)試中,我們會使用XUnit、FluentAssertion、NSubstitute

      測(ce)試場景1︰ 模擬一個請求,返回2個用戶

      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 = "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>()

      .And

      .HaveCount(2)

      .And

      .Contain(x => x.FirstName == "John")

      .And

      .Contain(x => x.LastName == "Deere")

      .And

      .Contain(x => x.LastName == "Doe");

      }

      }

      •在(zai)以上測(ce)試中,我們期望獲(huo)取一個成功的(de)響(xiang)應,並得到2個用戶的(de)信(xin)息。

      •我們期望從Service中得到的(de)數據是JSON格式的(de)。

      •我們使用一個偽造(zao)的(de)處(chu)理程序(xu)初始化了(liao)一個HttpClient對象,然後(hou)定(ding)義了(liao)我們期望的(de)得到的(de)偽造(zao)對象httpClientFactoryMock.CreateClient().Returns(fakeHttpClient);

      測(ce)試場景2︰ 模擬一個404錯(cuo)誤,返回空數據

      public class UserServiceTests

      {

      [Fact]

      public async Task WhenABadUrlIsProvided_ServiceShouldReturnNull()

      {

      // Arrange

      var httpClientFactoryMock = Substitute.For();

      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();

      }

      }

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

      不知(zhi)道你看完之後(hou)有何感想呢(ne)?有沒有收獲(huo)到什麼新的(de)知(zhi)識,自己的(de)操作(zuo)是否也完成了(liao)呢(ne)?希望大(da)家以後(hou)也多多支持我們網站,這(zhe)里有許多豐富的(de)資(zi)訊(xun),讓你大(da)飽眼福哦(ou)。

About IT165 -廣告服務 -隱私聲明 -版權申明 -免(mian)責(ze)條款 -網站地圖 -網友投稿 -聯系方式
本站內容來自于(yu)互聯網,僅(jin)供用于(yu)網絡技術學習,學習中請遵循相關法律法規
体彩天下官网 | 下一页