2013-11-21 4 views
1

컨트롤러 용 단위 테스트를 작성하려고합니다.apicontroller를 테스트하는 방법은 무엇입니까?

[HttpPost] 
public Answer RegistrationSocial([FromBody] RegistrationSocialRequest newUser) 
{ 
    var answer = new Answer(); 
    try 
    { 
     userProvider.RegistrationSocial(newUser.Email, 
             newUser.PhoneNumber, 
             newUser.SocialProviderId, 
             newUser.SocialProvider, 
             UserIP); 
     answer.Result = 0; 
    } 
    catch (Exception e) 
    { 
     answer.Result = 2; 
     answer.Description = "Server error"; 
    } 
    return answer; 
} 

private string UserIP 
{ 
    get { return HttpContext.Current.Request.UserHostAddress; } 
} 

RegistrationSocialRequest는 모델 바인딩에 필요한 POCO 개체입니다. 이 메서드는 json을 반환하고 클라이언트가 작업 할 수 있도록 변경 내용을 추적하려고합니다. 테스트를 위해 Moq 및 MSTest를 사용합니다. 다음은 테스트 방법입니다.

[TestMethod] 
public void IsJsonOkRegistrationSocial() 
{ 
    //Arrange 
    Mock<IUserProvider> mock = new Mock<IUserProvider>(); 
    mock.Setup(m => m.RegistrationSocial("[email protected]", 
             "123", 
             "0987654321", 
              1, 
              "192.0.0.1")); 

    UserController controller = new UserController(mock.Object); 
    Answer answerOk = new Answer 
    { 
     Result = 0, 
     Caption = "Ok", 
     Description = null, 
     Data = null 
    }; 

    //Action 
    var answer = controller.RegistrationSocial(new RegistrationSocialRequest 
    { 
     SocialProvider = 1, 
     Email = "[email protected]", 
     PhoneNumber = "123", 
     SocialProviderId = "0987654321" 
    }); 

    //Assert 
    Assert.AreEqual(JsonConvert.SerializeObject(answerOk), 
        JsonConvert.SerializeObject(answer)); 
} 

그러나 UserIP가 null이기 때문에 예외가 발생했습니다. 이유는 무엇입니까? 나는 단위 테스트에서 새롭다, 아마 이것 모두는 더 쉬운 방법으로 행해질 수 있었다.

답변

1

단위 테스트를 실행할 때 웹 환경 외부에서 코드를 실행할 때 HttpContext.Current.Request.UserHostAddress가 예상대로 설정되지 않습니다.

해결 방법은 'GetUserIP'메서드를 사용하여 'IHttpContextService'를 만드는 것입니다. 이런 방식으로 UserIP 속성에서이 서비스를 호출 할 수 있으며 테스트 할 때 인터페이스를 조롱 할 수 있습니다.

+0

엔지니어링을 넘어서는 경우도 있지만,이 솔루션은 효과가 있습니다. 고맙습니다. – Arthur

관련 문제