2013-01-11 3 views
0

내 리포지토리 계층에서 Web API 메서드를 호출하고 있습니다. 아무도 모의를 사용하여 테스트하는 방법을 제안 할 수 있습니까?단위 테스트 웹 API 호출 방법 방법

+2

웹 API 방법 (실제로는 리포지토리보다 상위 계층의 항목)은 리포지토리에서 호출하면 안됩니다. 그것은 다른 방법으로 주위에 있어야합니다 – MikeSW

+0

내가 서비스 계층에서 호출해도, 나는 그것을 호출하는 방법에 대한 단위 테스트를 작성하는 방법을 알아야합니다 – InTheWorldOfCodingApplications

+0

당신은 어떻게 웹 API를 호출합니까? – blank

답변

6

호출을 웹 API 메서드로 조롱하려면 호출하는 코드를 추상화해야합니다.

그래서 추상적 인 것이 :

public interface IMyApi 
{ 
    MyObject Get(); 
} 

다음은 실제 API 호출에 HttpClient를 사용하는이 인터페이스의 특정 구현 할 수 : 이제

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

다음으로 귀하의 단위 테스트는 사소한 mocking 프레임 워크를 사용하여 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 
...