2016-08-18 5 views
2

기존 웹 API 2 프로젝트의 단위 테스트를 작성하고 있습니다. 어떤 경우에 나는 Ploeh AutofixtureMoq을 사용하고 있습니다.모의 HttpResponseMessage Moq 및 AutoFixture로 단위 테스트 API 사용하기

시험 방법은 :

[Test] 
    public async Task Service1_TestMethod() { 

     //some code here 
    var fakeemail = FakeBuilder.Create<string>("[email protected]"); 
     var fakeUserInvite = 
       FakeBuilder.Build<UserInvite>() 
        .With(i => i.EmailAddress, fakeemail) 
        .With(i => i.Username, fakeemail) 
        .Create(); 
     var fakeUserToken = FakeBuilder.Create<string>(); 
     var fakeHttpResponseMessage = 
        Fixture.Build<HttpResponseMessage>() 
           .With(h => h.StatusCode, HttpStatusCode.OK).Create(); 
    //Here i am mocking another service method. Whose response is HttpResponseMessage. 
    Service2.Setup(i => i.AddUser(fakeUserInvite, fakeUserToken)) 
      .ReturnsAsync(fakeHttpResponseMessage); 

    var result = await Service1.AddUser(/* */); 

} 

서비스 1 방법 업데이트 :

public async Task<bool> AddUser(/* */) 
    { 
    var response = await Service2.AddUser(userInvite, userToken); // response is null even after mocking it. 

    // Add user code follows bassed on the above response. 

    } 

난 후 모든 것이 작동 Service2.AddUser 전화를 언급합니다. 이 호출과는 별도로이 메소드에는 많은 코드가 있습니다. 이 통화에만 문제가 있습니다. 이 호출이 조롱 된 HttpResponseMessage을 반환하면 모든 것이 작동합니다.

Service2은 외부 API입니다. 나는 단지 mockHttpResponseMessage하는 방법을 궁금해합니다. 어떤 도움을 주셔서 감사합니다.

+0

예외가 있습니까? 그렇다면 어느 것입니까? –

+0

예외는 없습니다. 단지'response'는'Service2.AddUser' 호출에 대해 null입니다.나는'response'를'setup' 호출 중에 조롱 한 객체'fakeHttpResponseMessage'로하고 싶습니다. – Venky

+2

'fakeUserInvite'와'fakeUserToken'이'Service2.AddUser' 메소드에 어떻게 전달되고 있습니까? 실제 호출은 Moq이'fakeHttpResponseMessage'를 리턴하기 위해 같은 객체를 사용해야합니다. Moq 설명서에서 [일치하는 인수] (https://github.com/Moq/moq4/wiki/Quickstart#matching-arguments)를 참조하십시오. –

답변

7

당신이 만드는 스텁 :

service2.Setup(i => i.AddUser(fakeUserInvite, fakeUserToken)) 
     .ReturnsAsync(fakeHttpResponseMessage); 

는 MOQ가 fakeHttpResponseMessage를 반환하기 위해 fakeUserInvitefakeUserToken가 참조하는 것과 같은 정확한 같은 개체를 만들 수있는 실제 호출이 필요합니다.

Moq's argument matching은 스텁에 지정된 인수가 이고 실제 호출에서 만들어진 인수가임을 확인하기 때문입니다. 일치하지 않으면 스텁이 일치하지 않고 Moq는 메소드의 반환 유형에 대한 기본값을 반환합니다.이 경우 은 참조 유형이므로 null입니다.

당신이 fakeUserInvitefakeUserToken 참조가 실제 service2.AddUser 호출에 전달되고 있는지 확인 할 수 있습니다,이 문제를 해결하려면하거나 다소 덜 특정 argument constraints를 사용할 수 있습니다.

다음
service2.Setup(i => i.AddUser(
      It.Is<UserInvite>(u => u.EmailAddress == fakeEmail && 
            u.Username == fakeEmail), 
      fakeUserToken)) 
     .ReturnsAsync(fakeHttpResponseMessage); 

우리가 AddUser 메서드를 호출해야한다는 것 : 여기

은 예입니다

  1. EmailAddressUsername 속성 fakeEmail와 같은 값을 가지고 UserInvite 객체 첫 번째 인수
  2. 두 번째 인수로 fakeUserToken과 동일한 값
  3. 그 인수의 실제 값이 특정 테스트 시나리오에 문제가되지 않는 경우

, 당신은 말에 의해 관계없이 어떤 인수 AddUser으로 호출되고의 항상 반환 fakeHttpResponseMessage에 MOQ를 알 수 있습니다 :

service2.Setup(i => i.AddUser(
      It.IsAny<UserInvite>(), 
      It.IsAny<string>())) 
     .ReturnsAsync(fakeHttpResponseMessage);