zoukankan      html  css  js  c++  java
  • 使用 Moq 测试.NET Core 应用 -- 其它

    第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html

    第二篇文章, 关于方法Mock的介绍: https://www.cnblogs.com/cgzl/p/9300356.html

    第三篇文章, 关于属性Mock的介绍: https://www.cnblogs.com/cgzl/p/9304567.html

    第四篇文章, 关于行为Mock的介绍: https://www.cnblogs.com/cgzl/p/9306728.html

    本文介绍使用Moq其它一些功能.

    使用的代码: https://github.com/solenovex/Moq4-Tutorial-Code 里面的 05 Before 部分.

    抛出异常

    这里是指让mock对象抛出异常.

    首先创建一个测试方法, 并设定球员年龄小于16岁时, IPhysicalExamination会在调用IsHealthy()方法时抛出异常:

    随后在球员审批的方法里, 需要捕获这个异常, 并返回相应的结果:

    这个测试会通过:

    上面使用的是泛型的版本来抛出异常, 也可以不使用泛型, 直接抛出异常:

    Events

    我们还可以让mock对象来引起事件.

    首先在IPhysicalExamination添加一个event:

    每当IsHealthy()方法被调用后, 就应该引起这个event事件.

    在实现类里, 也需要加上这个event, 但是暂时不对它做任何其它动作:

    在转会审批类里, 做这样几处修改:

    添加一个处理事件的方法, 如果事件被触发, 那么PlayerHealthChecked这个标识就会变成true.

    创建一个测试方法, 以判断该event是否被触发:

    这个测试应该会失败:

    因为该event并没有被触发(PhysicalExamination里并没做什么动作).


    这时, 我们可以使用mock对象来触发该事件, 在测试方法里, 手动调用mock对象的Raise()方法:

    第一个参数是lambda表达式, 该事件绑定到null, 第二个参数针对本例是EventArgs.Empty即可.

    再测试, 就会通过:

    第二种方法是在设置IsHealthy()方法的时候对事件进行触发设定:

    这样的话只要IsHealthy()方法被调用, 那么HealthChecked这个事件也会被触发.

    该测试也会通过:

    设定连续调用的不同返回值

    使用SetupSequence()方法可以为mock对象的成员在连续调用的时候每次都返回指定的值(或抛出指定的异常):

    该测试执行时, 第一次调用IsHealthy()方法时, 该方法返回true, 体检通过; 而第二次调用IsHealthy()方法时, 返回false, 体检不通过.

    这个测试是会通过的:

    Mock 不实现接口的方法

    首先建立一个类, 它没有实现任何接口, 里面有一个方法用于判断当前是否处于转会期:

    然后在转会审批类里使用该类:

    创建一个测试方法, mock上面的类:

    但是该测试回失败:

    这是因为Moq在mock这种类的时候要求其方法必须是virtual的.

    那么修改该方法为virtual:

    这样的话测试就会通过:

    Protected Virtual 方法

    为上面的类再添加一个protected virtual 方法:

    如果想要mock这个方法的话, 需要这样用:

    有参数的话, 需要用到ItExpr类.

    Linq to Mocks

    我们可以把之前写的设定代码使用Linq的方式来写:

    这里要使用Mock.Of<T>()方法. 参数的lambda表达式里面可以设定mock对象成员的返回值.

    由于这种方法直接返回所需的类型, 所以在使用mock对象的时候就无需使用.Object属性了.

    该测试也会通过:

    Moq的简介就到这里, 其实看官方文档会更快速一些: https://github.com/Moq/moq4/wiki/Quickstart

    重构后的代码在: https://github.com/solenovex/Moq4-Tutorial-Code 里面的05 After.

  • 相关阅读:
    阻塞队列之LinkedTransferQueue
    BlockingQueue drainTo()
    jedis常用API
    在Redis集群中使用pipeline批量插入
    序列化
    springmvc单文件上传
    hibernateValidate
    springmvc使用spring自带日期类型验证
    springmvc自定义日期编辑器
    springmvc__SimpleUrlHandlerMapping(对访问地址进行加工,以键值对的形式)
  • 原文地址:https://www.cnblogs.com/cgzl/p/9308723.html
Copyright © 2011-2022 走看看