使用Moq框架进行单元测试
问题描述:
我想用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);
}
我是牛逼知道如何测试这个
答
您当前的测试方法是没有意义的我。
如果您正在测试您的RestClient
类,它实现IRestClient
,则不需要模拟IRestClient
本身。你需要嘲笑所有的外部依赖关系 - 你已经创建了模拟IHttpWebRequestFactory
,现在你需要将它注入到测试对象中。我没有看到你的班级的其余部分,但我认为你的WebRequest
对象是IHttpWebRequestFactory
类型 - 你需要指定你的工厂模拟。
现在你需要定义测试用例。我可以很快看到以下内容(但您可以有更多原因):
- StatusCode不正确。
- StatusCode可以,但是responseStream为null。
- StatusCode正常,responseStream不为null,方法执行成功。
- 在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);
你能提供什么,你只是通过代码表示的例子..都说状态代码是确定 –
我试图测试在Restclient类 –
中的makeRequest方法非常感谢@arghtype –