首页 > 其他分享 >单元测试 - Moq

单元测试 - Moq

时间:2023-07-08 19:11:23浏览次数:40  
标签:Moq 单元测试 Returns Mock new foo Setup mock

测试方法

// 准备 Mock IFoo 接口
var mock = new Mock<IFoo>();
// 配置准备模拟的方法,当调用接口中的 DoSomething 方法,并传递参数 "bing" 的时候,返回 true
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
// 方法的参数中使用了 out 参数
// out arguments
var outString = "ack";
// 当调用 TryParse 方法的时候,out 参数返回 "ack", 方法返回 true, lazy evaluated
mock.Setup(foo => foo.TryParse("ping", out outString)).Returns(true);
// ref 参数
var instance = new Bar();
// 仅仅在使用 ref 调用的时候,才会匹配下面的测试
mock.Setup(foo => foo.Submit(ref instance)).Returns(true);
// 当方法返回值得时候,还可以访问返回的值
// 这里可以使用多个参数
mock.Setup(x => x.DoSomething(It.IsAny<string>()))
.Returns((string s) => s.ToLower());
// 在被调用的时候抛出异常
mock.Setup(foo => foo.DoSomething("reset")).Throws<InvalidOperationException>();
mock.Setup(foo => foo.DoSomething("")).Throws(new ArgumentException("command");
// 延迟计算返回的结果
mock.Setup(foo => foo.GetCount()).Returns(() => count);
// 在每一次调用的时候,返回不同的值
var mock = new Mock<IFoo>();
var calls = 0;
mock.Setup(foo => foo.GetCountThing())
.Returns(() => calls)
.Callback(() => calls++);
// 第一次调用返回 0, 下一次是 1, 依次类推
Console.WriteLine(mock.Object.GetCountThing());

Mock接口

而由于Moq对依赖项进行了包装, 所以要获得实际的mock依赖项, 我们需要使用mockExamination.Object属性. 而这个属性的类型就是IPhysicalExamination.

Mock<IPhysicalExamination> mockExamination = new Mock<IPhysicalExamination>();

var approval = new TransferApproval(mockExamination.Object);

It类

这里用到了It这个类, 在Moq里, It这个类是用来做参数匹配的, it 就是"它"的意思, 它就代表需要被匹配的参数.

It.IsAny<T>(), 它表示传递给方法的参数的类型只要是T就可以, 值是任意的. 只要满足了这个条件, 那么方法的返回值就是后边Returns()方法里设定的值.

Mock<IPhysicalExamination> mockExamination = new Mock<IPhysicalExamination>();

mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);

var approval = new TransferApproval(mockExamination.Object);

它有下面几种用法:

  • Is<TValue>(Expression<Func<TValue, Boolean>>)
    可以接受一个表达式作为参数,并指定参数应该满足的条件。在Moq中,参数匹配器用于定义模拟对象应该如何响应特定输入的情况。
    mock.Setup(x => x.MyMethod(It.Is<int>(value => value > 10))).Returns(true);

  • IsAny<TValue>()

  • IsIn<TValue>(IEnumerable<TValue>)

  • IsInRange<TValue>(TValue, TValue, Range)

  • IsNotIn<TValue>(IEnumerable<TValue>)

  • IsNotNull<TValue>()

  • IsRegex(string)

参考

使用 Moq 测试.NET Core 应用 - Why Moq? - yangxu-pro - 博客园

标签:Moq,单元测试,Returns,Mock,new,foo,Setup,mock
From: https://www.cnblogs.com/tangge/p/17537688.html

相关文章

  • 软件测试常用工具总结(测试管理、单元测试、接口测试、自动化测试、性能测试、负载测试
    在软件测试的过程中,多多少少都是会接触到一些测试工具,作为辅助测试用的,以提高测试工作的效率,使用好了测试工具,能对测试起到一个很好的作用,同时,有些公司,也会要求掌握一些测试工具,或者,是在面试时,也会被问到测试工具的,比如,在面试时,最常见的问题便是,你在测试时,用的是什么测试工具?或者......
  • 单元测试-异常测试
    前面的文章(Java中的单元测试)已经说过单元测试中的mock测试,大都是正常分支下的测试,异常测试用于测试某些场景下是否会触发指定的异常,用来验证代码逻辑的正确性。目前根据Junit的版本有三种不同的方式,如下:1、@Test注解中的expected属性此方式比较简单,但是存在局限性,就是只能判断异......
  • C#中各单元测试框架比对
    下面是关于NUnit、xUnit.net、MSTest、SpecFlow和FluentAssertions等单元测试框架的优势和适用场景的简要比较:NUnit框架:优势:NUnit是一个历史悠久且成熟的框架,提供了广泛的功能和灵活性。它具有强大的断言库、丰富的扩展插件和广泛的社区支持。劣势:对初学者来说,可能存在一些学习曲线......
  • mybatis单元测试(无需启动容器)
    一、浅析相关类参考文档:https://blog.csdn.net/weixin_44778952/article/details/1096611251ConfigurationMyBatis在启动时会取读取所有配置文件,然后加载到内存中,Configuration类就是承载整个配置的类。SqlSessionFactoryBuilder调用build方法创建SqlSessionFactory,而SqlSessio......
  • 三. 软件工程 --- 单元测试
    1.单元测试(UnitTesting):是对软件中的最小可测试单元进行检查和验证。单元是构造软件系统的基础,只有使每个单元都得到足够的测试,系统的质量才能有可靠的保证,即单元测试是构筑产品质量的基石。 不能把单元测试任务堆积到系统测试阶段,否则大量故障堆积在项目中后期,项目后10%的......
  • Debug Golang源码中的单元测试
    goland配置如上,既可以debuggolang源码中的单元测试。......
  • 自媒体文章审核单元测试
    packagecom.heima.wemedia.test.service;importcom.heima.wemedia.WemediaApplication;importcom.heima.wemedia.service.WmNewsAutoScanService;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autow......
  • 【转】Java 单元测试
    Java单元测试在测试方法上添加@Test注解:   ......
  • C 语言常用单元测试框架
    C语言常用单元测试框架1.C单元测试框架1.1什么是单元测试和单元测试框架单元测试是软件测试重要步骤,是对软件中最小可测试单元,在与其他部分隔离情况下,进行检查校验,查看单元是否按设计意图工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数......
  • 如何编写高质量的单元测试?
    编写高质量的单元测试可以确保你的代码具有正确性、可靠性和可维护性。以下是一些指导原则:测试覆盖率:尽量覆盖代码的各个路径和分支,确保所有关键功能都经过了测试。使用测试覆盖率工具来评估你的代码覆盖率,例如使用代码插桩工具或相关IDE中的集成覆盖工具。独立性:每个测试应该......