Moq 在.net Core 单元测试中的使用

Moq,主要用来伪造接口的实现类,实现方法,属性

moq

The most popular and friendly mocking framework for .NET

What?

Moq (pronounced "Mock-you" or just "Mock") is the only mocking library for .NET developed from scratch to take full advantage of .NET Linq expression trees and lambda expressions, which makes it the most productive, type-safe and refactoring-friendly mocking library available. And it supports mocking interfaces as well as classes. Its API is extremely simple and straightforward, and doesn't require any prior knowledge or experience with mocking concepts.

Github:https://github.com/moq/moq4

在线方法MSDN文档:

  http://www.nudoq.org/#!/Packages/Moq/Moq/Moq

  http://www.nudoq.org/#!/Packages/Moq/Moq/It

常用方法汇总:
   定义Mock对象

  1.new Mock<IFoo>();

   设置mock对象返回值,返回固定值或者ThrowException

  1.mockInstance.SetUp().Returns() 

    mock.Setup(foo => foo.DoSomething("ping")).Returns(true);

  2.mockInstance.SetUpSet()

  mock.SetupSet(s => s.Name = "zhangsan");

 3.mockInstance.SetupProperty()    SetupProperty方法返回mockInstance对象,可以继续.方法,方便多次设置

  mock
   .SetupProperty(f => f.Name, "haha")
   .SetupProperty(f => f.Add(6), false)
   .SetupProperty(f => f.Bar, new Bar());

CallBack 可以设置回调函数,执行回调输出
mock.Setup(foo => foo.GetCount()) .Returns(() => calls) .Callback(() => calls++);


It静态类的用法:

 

Moq 关于It类的文档: http://www.nudoq.org/#!/Packages/Moq/Moq/It

它有下面几种用法:

  • Is<TValue>(Expression<Func<TValue, Boolean>>)
  • IsAny<TValue>()
  • IsIn<TValue>(IEnumerable<TValue>)
  • IsInRange<TValue>(TValue, TValue, Range)
  • IsNotIn<TValue>(IEnumerable<TValue>)
  • IsNotNull<TValue>()
  • IsRegex(string)

It.isAny<type>(); 返回制定类型的任意数值

It.is<string>(condition c) 输入制定条件,返回满足条件的制定类型数据

It.Ref<type>.IsAny  返回ref 类型的 type 实例

It.IsInRange<type>(from f,to t,enumType)  返回制定类型的from-to的数据,常用语int类型,数值类型

It.IsRegex("[a-d]",RegeOption.IgnoreCase)  正则表达式,生成字符串.

 

 

 

其他高级用法:

在创建Mock对象的时候, 还可选传递一个MockBehavior这个参数.

MockBehavior是一个枚举, 它有三个值:

  • MockBehavior.Strict, 如果mock对象上的方法没有被预先设置好, 那么测试中调用该方法的时候就会抛出异常.
  • MockBehavior.Loose, 即使方法没有被预先设置, 调用它的时候也不会抛出异常. 它会返回该方法返回类型的默认值.
  • MockBehavior.Default, 它代表MockBehavior.Loose.

 

Mock.Of()

Mock.Get()

 

确认方法被调用(Verify)

创建一个新的测试方法:

与状态测试不同, 这里我不使用Assert, 我是用的是mock.Verify() 来判定其参数里的方法会被执行. 在这里也可以使用It类进行参数匹配.

该测试会通过, 表示IsHealthy确实被执行了:

 

如果我改变一下Verify里IsHealthy()方法的参数范围:

那么针对此例, 测试就会失败:

这是因为IsHealthy()方法被调用时的参数与我所期待的参数不一致.

 

自定义错误信息

这时, 我们可以使用另一个重载版本的Verify()方法, 它可以添加一个错误信息的参数:

这时测试失败的信息如下:

 

此外通过重载方法, 还可以判断方法被调用的次数

 

方法被调用次数

还是用到了Verify的重载方法和Times这个struct.

1. 没被调用:

2. 被调用1次:

3. 被调用特定次数:

Times这个struct里面还有很多选项, 请自行摸索.

 

确认属性访问

首先是Get.

与之前调用的Verify()不同, 针对属性, 需要使用VerifyGet()方法来确保属性被访问了:

这个测试会通过, 因为这个属性确实被访问了:

 

检查另一个没有被访问的属性:

那么结果就会失败:

 

下面是Set.

很简单, 使用VerifySet()方法即可. 再创建一个测试方法:

在VerifySet方法里需要设定被Set的属性以及被Set的值.

针对此例, 这个测试会通过:

但是如果Set的值不正确, 测试就会失败:

 

转载于:https://www.cnblogs.com/mailaidedt/p/10215798.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值