2017-10-17 123 views
1

我想用Moq来测试这个方法。有人能告诉我如何做到这一点? 我在查询字符串中附加了用户标识和值。如何在moq中模仿这个。该类的名称是RestClient.cs。我创建了一个名为IRestClient的接口。 公共接口IRestClient { 串makeRequest的(字符串userid,字符串值); }使用Moq框架进行单元测试

这是RESTClient实现类的makeRequest的方法

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; 
} 

这是我在创造我的单元测试类的最小起订量称为RestClientTests.cs

尝试
[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); 
} 

我IhttpWebRequestFactory界面看起来像这个:

interface IHttpWebRequestFactory 
{ 
    HttpWebRequest Create(string uri); 

} 

我是牛逼知道如何测试这个

回答

0

您当前的测试方法是没有意义的我。

如果您正在测试您的RestClient类,它实现IRestClient,则不需要模拟IRestClient本身。你需要嘲笑所有的外部依赖关系 - 你已经创建了模拟IHttpWebRequestFactory,现在你需要将它注入到测试对象中。我没有看到你的班级的其余部分,但我认为你的WebRequest对象是IHttpWebRequestFactory类型 - 你需要指定你的工厂模拟。

现在你需要定义测试用例。我可以很快看到以下内容(但您可以有更多原因):

  1. StatusCode不正确。
  2. StatusCode可以,但是responseStream为null。
  3. StatusCode正常,responseStream不为null,方法执行成功。
  4. 在try块中抛出异常。

现在对于每个测试用例,你需要准备适当的设置和验证。例如,对于第一次,您需要您的模拟工厂返回模拟请求,该请求将返回模拟响应而不是OK结果代码。现在你需要调用你的实际对象。作为验证,您需要检查是否抛出了ApplicationException,并且实际调用了所有的嘲笑。

好的,这是第二测试案例的部分设置。这将准备嘲笑工厂返回嘲笑请求,它会返回OK代码嘲笑回应:

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类 –

+1

中的makeRequest方法非常感谢@arghtype –

相关问题