使用Moq框架进行单元测试



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

这是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 的单元测试类中创建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);
}

我不知道如何测试这个

您当前的测试方法对我来说毫无意义。

如果您正在测试实现IRestClientRestClient类,则不需要模拟IRestClient本身。您需要模拟所有外部依赖项——您已经为IHttpWebRequestFactory创建了mock,现在需要将其注入到测试对象中。我看不到您类的其他部分,但我假设您的WebRequest对象的类型是IHttpWebRequestFactory——您需要将工厂mock分配给它。

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

  1. StatusCode不正常
  2. StatusCode正常,但responseStream为null
  3. StatusCode正常,responseStream不为null,方法执行成功
  4. 在try块中引发异常

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

好的,这是第二个测试用例的部分设置。它将准备返回模拟请求的模拟工厂,该工厂返回带有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);

最新更新