2017-10-17 9 views
1

Moq를 사용하여이 방법을 테스트하고 싶습니다. 누군가 이걸 어떻게하는지 말해 줄 수 있니? 쿼리 문자열에 사용자 ID와 값을 연결하려고합니다. moq에서 이것을 모방하는 법. 클래스 이름은 RestClient.cs입니다. IRestClient라는 인터페이스를 만들었습니다. 공용 인터페이스 IRestClient { 문자열 MakeRequest (string userID, string value); }Moq 프레임 워크를 사용한 단위 테스트

이것은이 RestClientTests.cs

라는 내 유닛 테스트 클래스의 MOQ를 만드는 나의 시도는

public string MakeRequest(string userId,string value) 
{ 
    Logger.Info("Entering method MakeRequest()." + "Input Parameter: " + userId+Constant.NewLine+value); 
    string strResponseValue = string.Empty; 

    // The HttpWebRequest class allows you to programatically make web requests against an HTTP server. 
    // create the WebRequest instantiated for making the request to the specified URI. 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Constant.webServerURI+"?id="+userId + Constant.UserValueAppend + value); 

    //Gets or sets the method for the request.(Overrides WebRequest.Method.) 
    request.Method = httpMethod.ToString(); 

    //Initially response from webserver is set to null. 
    HttpWebResponse response = null; 

    try 
    { 
     // Get the response in the response object of type HttpWebResponse 
     // The request object of HttpWebRequest class is used to "get" the response (GetResponse()) from WebServer and store it in the response object 
     response = (HttpWebResponse)request.GetResponse(); 

     // We check that the response StatusCode is good and we can proceed 
     if (response.StatusCode != HttpStatusCode.OK) 
     { 
      Logger.Error("Error" + response.StatusCode.ToString()); 
      throw new ApplicationException(Constant.ErrorDisplay + response.StatusCode.ToString()); 
     } 

     // Process the response string 
     // We obtain the ResponseStream from the webserver using "get" (GetResponseStream()) 
     // The Stream Class provides a generic view of a sequence of bytes 

     using (Stream responseStream = response.GetResponseStream()) 
     { 
      if (responseStream != null) 
      { 
       using (StreamReader reader = new StreamReader(responseStream)) 
       { 
        //read the stream and store it in string strResponseValue 
        strResponseValue = reader.ReadToEnd(); 

        }//End of StreamReader 
      } 
     }//End of using ResponseStream 
    }// End of using Response 

    catch (Exception ex) 
    { 
     Logger.Error("Error" + ex.Message.ToString()); 
     strResponseValue = ("Error " + ex.Message.ToString()); 
    } 
    finally 
    { 
     if (response != null) 
     { 
      ((IDisposable)response).Dispose(); 
     } 
    } 
    //return the string strResponseValue 
    Logger.Info("Leaving method MakeRequest." + "Output parameter: " + strResponseValue); 
    return strResponseValue; 
} 

위해 RESTClient 클래스의하여 makeRequest 방법 내 IhttpWebRequestFactory 인터페이스의 모습

[TestMethod] 
public void TestMethod1() 
{ 
    var expected = "response content"; 
    var expectedBytes = Encoding.UTF8.GetBytes(expected); 
    var responseStream = new MemoryStream(); 
    responseStream.Write(expectedBytes, 0, expectedBytes.Length); 
    responseStream.Seek(0, SeekOrigin.Begin); 

    var mockRestClient = new Mock<IRestClient>(); 
    var mockHttpRequest = new Mock<HttpWebRequest>(); 

    var response = new Mock<HttpWebResponse>(); 
    response.Setup(c => c.GetResponseStream()).Returns(responseStream); 

    mockHttpRequest.Setup(c => c.GetResponse()).Returns(response.Object); 

    var factory = new Mock<IHttpWebRequestFactory>(); 
    factory.Setup(c => c.Create(It.IsAny<string>())).Returns(mockHttpRequest.Object); 

    var actualRequest = factory.Object.Create("http://localhost:8080"); 
    actualRequest.Method = WebRequestMethods.Http.Get; 

    string actual; 

    using (var httpWebResponse = (HttpWebResponse)actualRequest.GetResponse()) 
    { 
     using (var streamReader = new StreamReader(httpWebResponse.GetResponseStream())) 
     { 
      actual = streamReader.ReadToEnd(); 
     } 
    } 

    mockRestClient.Setup(moq => moq.MakeRequest("xxx", "s")).Returns(actual); 
} 

이 :

interface IHttpWebRequestFactory 
{ 
    HttpWebRequest Create(string uri); 

} 

나는 아니오 이 방법을 테스트하는 방법을 반드시 알아 두십시오.

답변

0

현재 테스트 방법이 적합하지 않습니다.

IRestClient을 구현하는 RestClient 클래스를 테스트하는 경우 IRestClient을 모의 할 필요가 없습니다. 대신 외부 종속성을 모두 모방해야합니다. 이미 IHttpWebRequestFactory 모의 객체를 만들었으므로 이제 테스트 객체에 주입해야합니다. 수업 중 나머지는 보이지 않지만, WebRequest 객체의 유형이 IHttpWebRequestFactory 인 것으로 가정합니다. 공장 모의 작업을 할당해야합니다.

이제 테스트 케이스를 정의해야합니다. 다음을 신속하게 볼 수 있습니다 (원인은 다양 할 수 있습니다).

  1. StatusCode가 유효하지 않습니다.
  2. StatusCode는 정상이지만 responseStream은 null입니다.
  3. StatusCode는 정상이며 responseStream은 null이 아니며 메서드가 성공적으로 실행됩니다.
  4. try 블록에 예외가 발생합니다.

각 테스트 케이스에 대해 적절한 설정 및 유효성 검사를 준비해야합니다. 예를 들어, 1st의 경우 조롱 한 요청을 반환하기 위해 조롱 된 팩토리가 필요하며 이는 OK 결과 코드가 포함 된 조롱 된 응답을 반환합니다. 이제 실제 개체를 호출해야합니다. 유효성 검사로서 ApplicationException이 던져지고 모든 모의 객체가 실제로 호출되었는지 확인해야합니다.

두 번째 테스트 케이스에서는 부분 설정입니다. 그것은 확인 코드를 조롱 응답 반환 요청 조롱 반환 조롱 공장 준비 :

var response = new Mock<HttpWebResponse>(); 
response.SetupGet(c => c.StatusCode).Returns(HttpStatusCode.OK); 

var mockHttpRequest = new Mock<HttpWebRequest>(); 
mockHttpRequest.Setup(c => c.GetResponse()).Returns(response.Object); 

var factory = new Mock<IHttpWebRequestFactory>(); 
factory.Setup(c => c.Create(It.IsAny<string>))).Returns(mockHttpRequest.Object); 
+0

은 방금 코드를 통해 말의 예를 제공 할 수를 ..의 상태 코드는 내가 테스트하기 위해 노력하고있어 –

+0

확인 말한다 RestClient 클래스의 makeRequest 메소드 –

+1

감사합니다. @arghtype –