有时程序使用HttpWebRequest与HttpWebResponse实现HTTP的访问,但我们想测试它们不太容易实现。现在我们可以使用Moles框架来实现对它的单元测试。如果您还不了解Moles,可以先到官方网站看这个文档。下面我们来看片段代码:
[TestMethod] [HostType("Moles")] [Description("Testing with moles assemblies")] public void Get_KnownUrl_ReturnsExpectedValue() { var mockedWebResponse = new MHttpWebResponse(); MHttpWebRequest.AllInstances.GetResponse = (x) => { return mockedWebResponse; }; var googleUri = new Uri("http://www.google.com"); mockedWebResponse.StatusCodeGet = () => { return HttpStatusCode.OK; }; mockedWebResponse.ResponseUriGet = () => { return googleUri; }; mockedWebResponse.ContentTypeGet = () => { return "testHttpResponse"; }; string mockedResponseStr = @"<html> \r\n" + " <head></head> \r\n" + " <body> \r\n" + " <h1>Hello World</h1> \r\n" + " </body> \r\n" + "</html>"; mockedWebResponse.ContentLengthGet = () => { return mockedResponseStr.Length; }; using (var memoryStream = new MemoryStream()) { using (var sw = new StreamWriter(memoryStream)) { sw.Write(mockedResponseStr); sw.Flush(); memoryStream.Seek(0, SeekOrigin.Begin); mockedWebResponse.GetResponseStream = () => memoryStream; //act var request = WebRequest.Create("http://www.google.com"); var response = (HttpWebResponse)request.GetResponse(); // Assert string htmlContent = null; using (var streamReader = new StreamReader(response.GetResponseStream())) { htmlContent = streamReader.ReadToEnd(); } Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); Assert.AreEqual(mockedResponseStr.Length, response.ContentLength); Assert.AreEqual(mockedResponseStr, htmlContent); Assert.AreEqual(googleUri, response.ResponseUri); } } }
上面的基于MsTest的代码引用Moles生成的System.Moles.dll,HttpWebRequest与HttpWebResponse是在System.dll里的所以生成它。一开始对一些属性与方法的Mock操作,引用的是那些生成的MolesAssembiles,看字面意思可以了解代码的意图。接着模拟请求Google网站,返回我们遇先设置好返回的HtmlString,最后在验证中验证Stream,HttpStatusCode和Length是否一致。 当然您也可以测试其它属性成方法。注意最后请求的类是真实的类,可以演示我们把它们写在一起了。实际中可能是某个真实环境的API之类的方法。
希望对您开发有帮助。
您可以感兴趣的文章:
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。
分类:
UnitTest
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库