文章详情页
.NET使用Moq进行单元测试
浏览:53日期:2022-06-08 14:04:30
本篇体验Moq的一些基本用法。首先通过NuGet安装Moq。
模拟方法的返回值
public class HelperClass {public virtual Boolean IsEnabled(){ throw new Exception();} } [TestClass] public class UnitTest1 {[TestMethod]public void TestMethod1(){ var mock = new Mock<HelperClass>(); mock.Setup(x => x.IsEnabled()).Returns(true); Assert.AreEqual(mock.Object.IsEnabled(),true);} }
- Moq模拟的方法一般是virtual虚方法,接口方法
- mock.Object是指HelperClass的实例
模拟方法后执行回调函数
[TestClass] public class UnitTest1 {[TestMethod]public void TestMethod1(){ string temp = ""; var mock = new Mock<HelperClass>(); mock.Setup(x => x.IsEnabled()).Returns(true).Callback(() => { temp = "success"; }); Assert.AreEqual(mock.Object.IsEnabled(),true); if (temp == "success") {//TODO }} }
- 执行Return方法后,执行Callback回调方法,接收的参数类型是委托
模拟方法依次返回多个值
[TestClass] public class UnitTest1 {[TestMethod]public void TestMethod1(){ var mock = new Mock<HelperClass>(); mock.SetupSequence(x => x.IsEnabled()).Returns(true).Returns(false); Assert.AreEqual(mock.Object.IsEnabled(),true); Assert.AreEqual(mock.Object.IsEnabled(), false);} }
- SetupSequence方法可以为方法返回多个值
如果把以下2句:
Assert.AreEqual(mock.Object.IsEnabled(),true);
Assert.AreEqual(mock.Object.IsEnabled(), false);
颠倒一下顺序,变成:
Assert.AreEqual(mock.Object.IsEnabled(), false);
Assert.AreEqual(mock.Object.IsEnabled(),true);
结果,测试不通过。因为SutupSequence返回方法返回值的时候是有顺序的。
模拟第二次调用方法返回异常
[TestClass] public class UnitTest1 {[TestMethod]public void TestMethod1(){ var mock = new Mock<HelperClass>(); mock.SetupSequence(x => x.IsEnabled()).Returns(true).Throws(new Exception()); Assert.AreEqual(mock.Object.IsEnabled(),true); Assert.AreEqual(mock.Object.IsEnabled(), true);} }
- 通过Throws方法,在第二次调用IsEnable()方法时抛出异常。
直接返回被模拟方法的原始返回值
public class HelperClass {public virtual Boolean IsEnabled(){ throw new Exception();} } [TestClass] public class UnitTest1 {[TestMethod]public void TestMethod1(){ var mock = new Mock<HelperClass>(); mock.CallBase = true; mock.SetupSequence(x => x.IsEnabled()).CallBase(); Assert.AreEqual(mock.Object.IsEnabled(), true);} }
在被模拟的HelperClass类中,IsEnabled方法内部抛出异常。当把Moq实例的CallBase属性设置为true,并调用CallBase方法,可在测试方法中直接返回被模拟类中方法的原始返回值。
模拟泛型类
public class HelperClass<T> where T : class {public virtual Boolean IsEnabled(){ throw new Exception();} } public class Sample{} [TestClass] public class UnitTest1 {[TestMethod]public void TestMethod1(){ var mock = new Mock<HelperClass<Sample>>(); mock.SetupSequence(x => x.IsEnabled()).Returns(true); Assert.AreEqual(mock.Object.IsEnabled(), true);} }
到此这篇关于.NET使用Moq进行单元测试的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
标签:
ASP.NET
相关文章:
1. ASP.NET MVC把数据库中枚举项的数字转换成文字2. 一文透彻详解.NET框架类型系统设计要点3. 基于.NET 7 的 QUIC 实现 Echo 服务的详细过程4. ASP中实现字符部位类似.NET里String对象的PadLeft和PadRight函数5. ASP.NET Core实现中间件的几种方式6. 使用 .NET MAUI 开发 ChatGPT 客户端的流程7. .NET Core 分布式任务调度ScheduleMaster详解8. ASP.NET堆和栈四之对托管和非托管资源的垃圾回收和内存分配9. .Net中Task Parallel Library的进阶用法10. .NET 6实现滑动验证码的示例详解
排行榜