zoukankan      html  css  js  c++  java
  • Unit Test单元测试时如何模拟HttpContext

    参考文章:http://blog.csdn.net/bclz_vs/article/details/6902638

                 http://www.cnblogs.com/PurpleTide/archive/2011/03/31/2001366.html

                 http://hi.baidu.com/xiaoduo170/item/a4f79a79c8bc733e71442358

    在做单元测试的时候HttpContext.Current是为null的

    而有些dll是和HttpContext绑定的(很大原因是...net大部分用于web项目)

    或者是试图在windows form 或者console中使用这些dll就挂了...

    当然HttpContext.Current是可以赋值的...那么最最简单的方法就是直接new一个HttpContext给它啦

    HttpRequest request = new HttpRequest("", "http://localhost", "");
                HttpContext.Current = new HttpContext(request, new HttpResponse(new System.IO.StringWriter()));
    
    最后在单元测试类中:
    [TestInitialize]
    public void MyTestInitialize()
    {
       HttpContext.Current = new HttpContext(new HttpRequest("", "http://localhost", ""),new HttpResponse(new StringWriter(new StringBuilder())));
    }
    

      ·  带有[ClassInitialize()]特性的方法在执行类中第一个测试之前调用。

        ·  带有[TestInitialize()]特性的方法在执行每个测试前都会被调用,一般用来初始化环境,为单元测试配置一个特定已知的状态。
        ·  带有[ClassCleanup()]特性的方法将在类中所有的测试运行完后执行。
        ·  带有[TestCleanup()]特性的方法将在每个测试运行完毕后执行,一般用来恢复环境变量到测试前的已知状态,可能是删除一个文件或者恢复数据库记录。

    所以[TestInitialize()]的调用时间是在构造函数之后,TestMethod之前。
     

    下表列出了这四个方法的解释和用法。

    函数名

    用法

    [ClassInitialize()]

    MyClassInitialize

    这个方法会在每次调用测试方法前被自动调用。假设在调用AddTest(),DivideTest()等方法之前都需要初始化一些基本数据列表,则这个工作可以放在MyClassInitialize函数里面,不用分别写在每个测试方法里。

    [ClassCleanup()]

    MyClassCleanup

    这个方法会在每次调用测试方法结束后被自动调用。

    [TestInitialize()]

    MyTestInitialize

    这个方法会在每次启动一个测试过程前被自动调用。例如本次测试一共选择了AddTest(),DivideTest()两个测试方法,则在调用这两个方法前,MyTestInitialize会先被调用。与MyClassInitialize不同的是,MyClassInitialize是每次调用测试方法时都会被调用,相当于函数级的调用,MyTestInitialize则只在测试过程前会被调用一次,在测试过程结束前,不会再被调用,相当于过程级的调用。

    [TestCleanup()]

    MyTestCleanup

    这个方法会在每次结束一个测试过程后被自动调用。

    Visual Studio 之所谓把这四个函数注释掉,原因是这四个函数只是示意性函数(从名字中就可以看出)。关键是看这四个函数的方法属性[ClassInitialize()],[ClassCleanup()], [TestInitialize()], [TestCleanup()]只要把相关的属性加到相关的方法上,那么这个方法就具有的上面所描述的功能。

    • 为什么需要Mock  本文转载: http://blog.csdn.net/cooleader320/article/details/1907535
    • 单元测试的基本原则应该是每次只验证一个方法,但是倘若遇到这样一种情况:
    • 测试方法依赖于其他一些难以操控的东西,如:网络,数据库。或者是你测试的代码依赖于系统的其他部分,甚至是系统的多个其他部分。在这种情况下,倘若不小心,最终可能发现自己不小心几乎初始化了系统的每一个组件,而所有这一切只是为了给某一个测试创造必要的运行环境。这不仅花费了大量的时间,要命的是这样的测试用例会被引入大量的耦合因素,很难到达“单元”测试的目的。我们该怎么办呢? 这是Mock的测试方法就派上用场了。Mock的英文的字面意思是:嘲笑,模仿,欺骗的意思。通过Mock,我们可以创建很多真实对象的替代品,在测试用例中使用它。
      • 什么情况下考虑使用Mock
      1)         真实的对象具有不可确定的行为(如:程序需要通过web service获得股票的实时价格)
      2)         对象很难被创建(如系统环境很难初始化)
      3)         真实对象的某些行为很难被触发(如网络错误,数据库ID自增序列溢出)
      4)         真实的对象令程序运行很缓慢
      5)         真实对象含有UI等不方便测试的因素
      6)         测试需要询问真实对象是如何被调用的(如异步调用的情况,需要验证Callbak的函数)
      7)         真实的对象目前还不存在(如依赖于其他项目组或则需要新的硬件系统)
  • 相关阅读:
    LeetCode155. 最小栈
    LeetCode154. 寻找旋转排序数组中的最小值 II
    LeetCode153. 寻找旋转排序数组中的最小值
    LeetCode152. 乘积最大子数组
    Python 异常值数据
    Python 生成周期性波动的数据 可指定数值范围
    VUE 组件 事件传递
    MyBatis-Plus And和Or的使用
    SQL Server 复制一条数据
    PLC扩展模拟量输入模块是什么
  • 原文地址:https://www.cnblogs.com/51net/p/3822826.html
Copyright © 2011-2022 走看看