zoukankan      html  css  js  c++  java
  • 使用Moles框架实现HttpWebRequest与HttpWebResponse的单元测试

           有时程序使用HttpWebRequestHttpWebResponse实现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,HttpWebRequestHttpWebResponse是在System.dll里的所以生成它。一开始对一些属性与方法的Mock操作,引用的是那些生成的MolesAssembiles,看字面意思可以了解代码的意图。接着模拟请求Google网站,返回我们遇先设置好返回的HtmlString,最后在验证中验证Stream,HttpStatusCode和Length是否一致。 当然您也可以测试其它属性成方法。注意最后请求的类是真实的类,可以演示我们把它们写在一起了。实际中可能是某个真实环境的API之类的方法。

    希望对您开发有帮助。

    您可以感兴趣的文章:

    使用Moles对静态方法做UnitTest


    作者:Petter Liu
    出处:http://www.cnblogs.com/wintersun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    该文章也同时发布在我的独立博客中-Petter Liu Blog

  • 相关阅读:
    hdu 4358 Boring counting 树状数组
    hdu 4501 小明系列故事——买年货 多重背包
    hdu 4503 湫湫系列故事——植树节 水题
    hdu 4031 Attack 树状数组
    技巧心得:如何解除运行office软件的时候弹出 正在安装 缺少pro11.msi对话框
    读书札记:VC++学习之Windows程序运行原理
    读书札记:7天搞定C语言(二)
    视频教程:计算器制作MFC
    读书札记:knowledge and Virtue
    技巧心得:各大搜索免费登记入口个人门户推广
  • 原文地址:https://www.cnblogs.com/wintersun/p/2315588.html
Copyright © 2011-2022 走看看