使用 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 部分.
https://segmentfault.com/a/1190000017569492 .NET Core单元测试之搞死开发的覆盖率统计
__________________________________________________________________________________
2 3 使用 Moq 测试.NET Core 应用 -- Mock 属性
[Fact]
public void ApproveYoungCheapPlayerTransfer()
{
//递归Mock
Mock<IPhysicalExamination> mockExamination = new Mock<IPhysicalExamination>();
//使用嵌套 子
Mock<IMedicalRoomStatus> medicalRoomStatus = new Mock<IMedicalRoomStatus>();
medicalRoomStatus.Setup(x => x.IsAvailable).Returns("PASS"); //.Returns(true);
//使用嵌套 父
Mock<IMedicalRoom> medicalRoom = new Mock<IMedicalRoom>();
medicalRoom.Setup(x => x.Status).Returns(medicalRoomStatus.Object);
//使用嵌套 父父
mockExamination.Setup(x => x.MedicalRoom).Returns(medicalRoom.Object);
//mockExamination.Setup(x =>
// x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
mockExamination.Setup(x => x.IsMedicalRoomAvailable).Returns(true);
mockExamination.Setup(x =>
x.IsHealthy(
It.Is<int>(age => age < 30),
It.IsIn<int>(80, 85, 90),
It.IsInRange<int>(75, 99, Range.Inclusive)))
.Returns(true);
var approval = new TransferApproval(mockExamination.Object);
var emreTransfer = new TransferApplication
{
PlayerName = "Emre Can",
PlayerAge = 24,
TransferFee = 0,
AnnualSalary = 4.52m,
ContractYears = 4,
IsSuperStar = false,
PlayerStrength = 80,
PlayerSpeed = 75,
};
var result = approval.Evaluate(emreTransfer);
Assert.Equal(TransferResult.Approved, result);
}
[Fact]
public void ApproveYoungCheapPlayerTransfer01()
{
//递归Mock可以为Mock对象设定默认值
Mock<IPhysicalExamination> mockExamination = new Mock<IPhysicalExamination>() {
DefaultValue= DefaultValue.Mock
};
//使用嵌套
mockExamination.Setup(x => x.MedicalRoom.Status.IsAvailable).Returns("PASS");//.Returns(true);
//mockExamination.Setup(x =>
// x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
mockExamination.Setup(x => x.IsMedicalRoomAvailable).Returns(true);
mockExamination.Setup(x =>
x.IsHealthy(
It.Is<int>(age => age < 30),
It.IsIn<int>(80, 85, 90),
It.IsInRange<int>(75, 99, Range.Inclusive)))
.Returns(true);
var approval = new TransferApproval(mockExamination.Object);
var emreTransfer = new TransferApplication
{
PlayerName = "Emre Can",
PlayerAge = 24,
TransferFee = 0,
AnnualSalary = 4.52m,
ContractYears = 4,
IsSuperStar = false,
PlayerStrength = 80,
PlayerSpeed = 75,
};
var result = approval.Evaluate(emreTransfer);
Assert.Equal(TransferResult.Approved, result);
}
[Fact]
public void PhysicalGradeShouldPassWhenTransferringSuperStar()
{
var mockExamination = new Mock<IPhysicalExamination>
{
DefaultValue = DefaultValue.Mock
};
mockExamination.SetupAllProperties();
// 开始追踪PhysicalGrade属性
mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Failed);
mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
var approval = new TransferApproval(mockExamination.Object);
var cr7Transfer = new TransferApplication
{
PlayerName = "Cristiano Ronaldo",
PlayerAge = 33,
TransferFee = 112m,
AnnualSalary = 30m,
ContractYears = 4,
IsSuperStar = true,
PlayerStrength = 90,
PlayerSpeed = 90
};
var result = approval.Evaluate(cr7Transfer);
Assert.Equal(PhysicalGrade.Passed, mockExamination.Object.PhysicalGrade);
}
[Fact]
public void ReferredToBossWhenTransferringSuperStar()
{
var mockExamination = new Mock<IPhysicalExamination>(MockBehavior.Strict);
mockExamination.SetupAllProperties();
mockExamination.Setup(x => x.MediacalRoom.Status.IsAvailable).Returns("Available");
//mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Passed);
//追踪属性配置默认值 追踪所有属性 mockExamination.SetupAllProperties() 必须放在第一行;
//mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Failed);
mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
var approval = new TransferApproval(mockExamination.Object);
var cr7Transfer = new TransferApplication
{
PlayerName = "Cristiano Ronaldo",
PlayerAge = 33,
TransferFee = 112m,
AnnualSalary = 30m,
ContractYears = 4,
IsSuperStar = true,
PlayerStrength = 90,
PlayerSpeed = 90
};
var result = approval.Evaluate(cr7Transfer);
// Assert.Equal(TransferResult.ReferredToBoss, result);
Assert.Equal(PhysicalGrade.Passed, mockExamination.Object.PhysicalGrade);
}
4 使用Moq 测试.NET Core 应用 -- Mock 行为
[Fact]
public void ShouldPhysicalExamineWhenTransferringSuperStar()
{
var mockExamination = new Mock<IPhysicalExamination>();
mockExamination.Setup(x => x.MediacalRoom.Status.IsAvailable).Returns("Available");
mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Passed);
mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())).Returns(true);
var approval = new TransferApproval(mockExamination.Object);
var cr7Transfer = new TransferApplication
{
PlayerName = "Cristiano Ronaldo",
PlayerAge = 33,
TransferFee = 112m,
AnnualSalary = 30m,
ContractYears = 4,
IsSuperStar = true,
PlayerStrength = 90,
PlayerSpeed = 90
};
var result = approval.Evaluate(cr7Transfer);
result = approval.Evaluate(cr7Transfer);
// Assert.Equal(TransferResult.ReferredToBoss, result);
// mockExamination.Verify(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>())); //判断指定的事件是否执行
// mockExamination.Verify(x => x.IsHealthy(33, 95, 88), "Arguments not match !!!!"); //判断指定的事件是否执行
//mockExamination.Verify(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()), Times.Exactly(2)); //判断指定的事件执行次数
//mockExamination.VerifyGet(x => x.MediacalRoom.Status.IsAvailable);
mockExamination.VerifySet(x => x.PhysicalGrade = PhysicalGrade.Passed);//判断PhysicalGrade属性已经被赋值了 PhysicalGrade.Passed
}
5. 使用 Moq 测试.NET Core 应用 -- 其它
[Fact]
public void PostponedWhenTransferringChildPlayer()
{
//mockExamination.Setup(x => x.IsHealthy(It.Is<int>(age => age < 16), It.IsAny<int>(), It.IsAny<int>()))
// .Throws<Exception>();
mockExamination.Setup(x => x.IsHealthy(It.Is<int>(age => age < 16), It.IsAny<int>(), It.IsAny<int>()))
.Throws(new Exception("The player is still a child"));
var childTransfer = new TransferApplication
{
PlayerName = "Some Child Player",
PlayerAge = 13,
TransferFee = 0,
AnnualSalary = 0.01m,
ContractYears = 3,
IsSuperStar = false,
PlayerStrength = 40,
PlayerSpeed = 50
};
var result = approval.Evaluate(childTransfer);
Assert.Equal(TransferResult.Postponed, result);
}
[Fact]
public void ShouldPlayerHealthCheckedWhenTransferringSuperStar()
{
//事件是否调用
mockExamination.DefaultValue = DefaultValue.Mock;
mockExamination.Setup(x => x.MediacalRoom.Status.IsAvailable).Returns("Avaliable");
mockExamination.SetupProperty(x => x.PhysicalGrade, PhysicalGrade.Passed);
mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()))
.Returns(true)
.Raises(x => x.HealthChecked += null, EventArgs.Empty);
//mockExamination.Setup(x => x.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()))
// .Returns(true)
// .Raises(x => x.HealthChecked += null, EventArgs.Empty);
var cr7Transfer = new TransferApplication
{
PlayerName = "Cristiano Ronaldo",
PlayerAge = 33,
TransferFee = 112m,
AnnualSalary = 30m,
ContractYears = 4,
IsSuperStar = true,
PlayerStrength = 90,
PlayerSpeed = 90
};
var result = approval.Evaluate(cr7Transfer);
//mockExamination.Raise(x => x.HealthChecked+=null, EventArgs.Empty);
Assert.True(approval.PlayerHealthChecked);
}
[Fact]
public void ShouldPostponedWhenNotInTransferPeriod()
{
//使用没有实现接口的方法, 注意这个方法必须是 virtual
mockTransferPolicy.Setup(x => x.IsInTransferPeriod()).Returns(false);
mockTransferPolicy.Protected().Setup<bool>("IsBannedFromTransferring") //Protected() 注意 protected
//.Setup<bool>("IsBannedFromTransferring",ItExpr.IsAny<String>()) //有参数的话, 需要用到ItExpr类.
.Returns(true);
//mockTransferPolicy.Protected()
// .Setup<bool>("IsBannedFromTransferring")
// // .Setup<bool>("IsBannedFromTransferring", ItExpr.IsAny<string>())
// .Returns(true);
var cr7Transfer = new TransferApplication
{
PlayerName = "Cristiano Ronaldo",
PlayerAge = 33,
TransferFee = 112m,
AnnualSalary = 30m,
ContractYears = 4,
IsSuperStar = true,
PlayerStrength = 90,
PlayerSpeed = 90
};
var result = approval.Evaluate(cr7Transfer);
Assert.Equal(TransferResult.Postponed, result);
}
[Fact]
public void LinqToMocks()
{
//Linq to Mocks 一次性为测试Mock对象配置返回值
var mockExamination = Mock.Of<IPhysicalExamination>
(
me => me.MediacalRoom.Status.IsAvailable == "Available" &&
me.PhysicalGrade == PhysicalGrade.Passed &&
me.IsHealthy(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()) == true
);
var mockTransferPolicy = Mock.Of<TransferPolicyEvaluator>
(
mt => mt.IsInTransferPeriod() == false
);
approval = new TransferApproval(mockExamination, mockTransferPolicy);
var cr7Transfer = new TransferApplication
{
PlayerName = "Cristiano Ronaldo",
PlayerAge = 33,
TransferFee = 112m,
AnnualSalary = 30m,
ContractYears = 4,
IsSuperStar = true,
PlayerStrength = 90,
PlayerSpeed = 90
};
var result = approval.Evaluate(cr7Transfer);
Assert.Equal(TransferResult.Postponed, result);
}
使用 Moq 测试.NET Core 应用的更多相关文章
- 使用 Moq 测试.NET Core 应用 - Why Moq?
什么是Mock 当对代码进行测试的时候, 我们经常需要用到一些模拟(mock)技术. 绿色的是需要被测试的类, 黄色是它的依赖项, 灰色的无关的类 在一个项目里, 我们经常需要把某一部分程序独立出来以 ...
- 使用 Moq 测试.NET Core 应用 -- Mock 方法
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 本文介绍使用Moq来Mock方法. 使用的代码: https://git ...
- 使用 Moq 测试.NET Core 应用 -- Mock 属性
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...
- 使用 Moq 测试.NET Core 应用 -- Mock 行为
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...
- 使用 Moq 测试.NET Core 应用 -- 其它
第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 第二篇文章, 关于方法Mock的介绍: https://www.cnbl ...
- Moq 测试 属性,常用方法
RhinoMock入门(7)——Do,With和Record-playback 摘要: (一)Do(delegate)有时候在测试过程中只返回一个静态的值是不够的,在这种情况下,Do()方法可以用来在 ...
- Moq 在.net Core 单元测试中的使用
Moq,主要用来伪造接口的实现类,实现方法,属性 moq The most popular and friendly mocking framework for .NET What? Moq (pro ...
- solr安装部署、solr测试创建core、用solrj 访问solr(索引和搜索)
一.安装solr4.8: 1.把apache-solr-4.8.1\example\webapps下的solr.war文件拷贝到Tomcat下的Tomcat7.0\webapps目录下,tomcat启 ...
- 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能
事由: 这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别. 顺带提一下: 啊啊啊啊 等我仔细看文档的时候文档 发现它 ...
随机推荐
- IO流对文件的读取操作
/*1. 在当前项目的根目录下有一个名为“info.txt”的文件,里面存放的内容如下(可手动创建录入,不需要使用IO流): 2. 利用IO流的知识读取info.txt文件的内容, 在控制台上打印大写 ...
- [转]JQuery 如何选择带有多个class的元素
比如下面代码需要选择同时带有这几个class的元素,怎么写? 1 <div class="modal fade in"></div> A: 1. 依次过滤 ...
- 添加超级链接为什么用a标签
a是anchor的简写,中文意思是锚点,而锚点的引申意思是连接,link已经被html占用了,只能用a来表示连接了.
- R: 聚类分析
判别与聚类的比较: 聚类分析和判别分析有相似的作用,都是起到分类的作用. 判别分析是已知分类然后总结出判别规则,是一种有指导的学习: 聚类分析则是有了一批样本,不知道它们的分类,甚至连分成几类也不知道 ...
- conda 添加bioconda源,创建/删除/重命名环境
1.conda安装 在https://repo.continuum.io/miniconda/选择conda版本 wget "https://repo.continuum.io/archiv ...
- NSSelectorFromString 使用示例
NSSelectorFromString 动态加载实例方法. SEL sel = NSSelectorFromString(@"yourMethod:")//有参数 if([obj ...
- 后台传Map到ftl
userInfo是后台传过来的Map <#list userInfo?keys as key> <tr > <td class="case_id" d ...
- Google androd性能优化经典
2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...
- Android 中 吐司显示不出来的原因分析
当你发现你的toast的show方法的确被执行了,但是却没有在界面中显示出来, 有问题的地方可能有两点: 1.Context上下文对象有问题,不是当前的上下文对象或者什么的: 2.message(即T ...
- c# get set 理解