使用Moq框架进行单元测试

时间:2017-10-17 23:42:21

标签: unit-testing httpwebrequest moq httpwebresponse

我想用Moq测试这个方法。谁能告诉我怎么做? 我在查询字符串中附加了userid和value。如何在moq中模仿这个。该类的名称是RestClient.cs。我创建了一个名为IRestClient的接口。 公共接口IRestClient     {         string MakeRequest(string userID,string value);     }

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

这是我尝试在我的unittest类中创建名为RestClientTests.cs

的moq
[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);

}

我不确定如何测试

1 个答案:

答案 0 :(得分:0)

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

如果您正在测试实现RestClient的{​​{1}}类,则无需模拟IRestClient本身。您需要模拟所有外部依赖项 - 您已经为IRestClient创建了模拟,现在需要将其注入到测试对象中。我没有看到你班上的其他人,但我认为你的IHttpWebRequestFactory对象的类型为WebRequest - 你需要将你的工厂模拟给它。

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

  1. StatusCode不正常。
  2. StatusCode没问题,但是responseStream为空。
  3. StatusCode没问题,responseStream不为null,方法执行成功。
  4. 在try块中抛出异常。
  5. 现在,对于每个测试用例,您需要准备正确的设置和验证。例如,对于1st,您需要您的模拟工厂返回模拟请求,该请求将返回模拟响应,而不是结果代码。现在你需要调用你的实际对象。作为验证,您需要检查是否抛出了ApplicationException,并且实际调用了所有模拟。

    好的,这是第二次测试用例的部分设置。它将准备模拟工厂,它返回模拟请求,返回带有OK代码的模拟响应:

    IHttpWebRequestFactory