2015-06-23 116 views
1

我最近開始tdd,但我的嘲笑知識不完整。我知道基礎知識,但是,對於一些沒有思考TDD的方法進行測試,真的讓我感到困惑。嘲笑圖書館方法

這裏就是我想測試

public int GetThirdPartyUserId(int serviceTypeId, string accessToken) 
{ 
    ThirdPartyRequestDetail requestDetail = GetThirdPartyRequestDetails(serviceType, accessToken); 

    IHttwrapConfiguration configuration = new HttwrapConfiguration(requestDetail.BaseUrl); 
    IHttwrapClient httwrap = new HttwrapClient(configuration); 

    Task<IHttwrapResponse<OpenAuthUserResponse>> response = httwrap.GetAsync<OpenAuthUserResponse>(requestDetail.PathAndQuery); 

     try 
     { 
      if (response.Result.Data != null && response.Status != TaskStatus.Faulted) 
      { 
       //Do something 
      } 
      else 
      { 
       //WANT TO TEST HERE 
      } 
     } 

} 

這裏是我的測試方法

private Mock<IHttwrapClient> _httpwrap; 
public void httprwapTest() 
{ 
    string accessToken = "invalid"; 
    int thirdPartySiteId = (int)ThirdPartyServiceType.GooglePlus; 
    string requestPath = _fixture.Create<string>(); 

    _httpwrap.Setup(item => item.GetAsync(requestPath)).Returns(Task.FromResult(new HttwrapResponse(HttpStatusCode.BadRequest, "body")));    
    OpenAuthUserResponse response = _oauthAuthenticator.GetThirdPartyUser(thirdPartySiteId, accessToken); 

    Assert.AreEqual(response.Error, OauthAuthenticatorErrorType.RequestFaulted); 

     } 

我試圖做的是下面,但它沒有被觸發。

_httpwrap.Setup(item => item.GetAsync(requestPath)).Returns(Task.FromResult(new HttwrapResponse(HttpStatusCode.BadRequest, "body"))); 

當httpwrap給我一個badrequest響應代碼時,如何測試我的類行爲?

回答

1

在目前的形式中,您不能使用傳統的模擬框架來幫助您進行測試。爲了讓Mocking工作,您必須使用Setup與您在生產代碼中使用的相同模擬。目前,您在測試中創建的模擬與您的測試方法所依賴的IHttpwrapClient之間沒有任何關聯。

您需要做的第一步是將HttpwrapClient的創建移到您要測試的方法之外。然後,您需要通過它的接口將其提供給代碼,以便您稍後可以從您的測試中提供它。

提供接口有三種常見方式。

  • 其注入的構造器類
  • 注入它通過一個屬性上的類
  • 把它作爲參數傳遞給函數

一般構造函數注入優於財產注入,但在很大程度上取決於哪種方法最適合(它們每個都有正面和負面)以及對於要注入的數據最有意義。

然後,您將創建接口的模擬並將其注入適當的代碼中。

就你的生產代碼而言,你仍然需要創建具體類的實例。你可以直接調用你的類,或者通過類似工廠的東西,或者使用一個IoC容器,比如Castle Winsor或者Ninject(還有其他幾個)。

+0

我把IHttpWrapClient移到了課堂外面,就像你說的那樣,我開始嘲笑那個課程和一切都很好,謝謝 –