2013-01-11 49 views
0

我在我的Repository層中調用一個Web Api方法。任何人都可以建議如何使用Mocking來測試它如何單元測試Web API調用方法

+2

一個Web API方法(其實,從比庫更高一層的任何東西)不應該從庫中調用。它應該是相反的 – MikeSW

+0

即使我從服務層調用它,我仍然需要知道如何爲調用它的方法編寫單元測試 – InTheWorldOfCodingApplications

+0

如何調用web api? – blank

回答

6

如果你想模擬對Web API方法的調用,你將不得不抽象調用它的代碼。

所以摘要:

public interface IMyApi 
{ 
    MyObject Get(); 
} 

,然後你可以有這個接口的具體實現,是使用HttpClient的調用實際的API:

public class MyApiHttp: IMyApi 
{ 
    private readonly string baseApiUrl; 
    public MyApiHttp(string baseApiUrl) 
    { 
     this.baseApiUrl = baseApiUrl; 
    } 

    public MyObject Get() 
    { 
     using (var client = new HttpClient()) 
     { 
      client.BaseAddress = this.baseAddress; 
      var response = client.GetAsync('/api/myobjects').Result; 
      return response.Content.ReadAsAsync<MyObject>().Result; 
     } 
    } 
} 

現在你的資料庫層也根本以此抽象爲構造參數:

public class Repository: IRepository 
{ 
    private readonly IMyApi myApi; 
    public Repository(IMyApi myApi) 
    { 
     this.myApi = myApi; 
    } 

    public void SomeMethodThatYouWantToTest() 
    { 
     var result = this.myApi.Get(); 
     ... 
    } 
} 

Next in你的單元測試使用你最喜歡的模擬框架來模擬對API的訪問是微不足道的。例如您與NSubstitute單元測試可能是這樣的:

// arrange 
var myApiMock = Substitute.For<IMyApi>(); 
var sut = new Repository(myApiMock); 
var myObject = new MyObject { Foo = "bar", Bar = "baz" }; 
myApiMock.Get().Returns(myObject); 

// act 
sut.SomeMethodThatYouWantToTest(); 

// assert 
...