第一篇文章, 关于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 应用的更多相关文章

  1. 使用 Moq 测试.NET Core 应用 - Why Moq?

    什么是Mock 当对代码进行测试的时候, 我们经常需要用到一些模拟(mock)技术. 绿色的是需要被测试的类, 黄色是它的依赖项, 灰色的无关的类 在一个项目里, 我们经常需要把某一部分程序独立出来以 ...

  2. 使用 Moq 测试.NET Core 应用 -- Mock 方法

    第一篇文章, 关于Mock的概念介绍: https://www.cnblogs.com/cgzl/p/9294431.html 本文介绍使用Moq来Mock方法. 使用的代码: https://git ...

  3. 使用 Moq 测试.NET Core 应用 -- Mock 属性

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

  4. 使用 Moq 测试.NET Core 应用 -- Mock 行为

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

  5. 使用 Moq 测试.NET Core 应用 -- 其它

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

  6. Moq 测试 属性,常用方法

    RhinoMock入门(7)——Do,With和Record-playback 摘要: (一)Do(delegate)有时候在测试过程中只返回一个静态的值是不够的,在这种情况下,Do()方法可以用来在 ...

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

    Moq,主要用来伪造接口的实现类,实现方法,属性 moq The most popular and friendly mocking framework for .NET What? Moq (pro ...

  8. solr安装部署、solr测试创建core、用solrj 访问solr(索引和搜索)

    一.安装solr4.8: 1.把apache-solr-4.8.1\example\webapps下的solr.war文件拷贝到Tomcat下的Tomcat7.0\webapps目录下,tomcat启 ...

  9. 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能

    事由: 这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别. 顺带提一下: 啊啊啊啊 等我仔细看文档的时候文档 发现它 ...

随机推荐

  1. IO流对文件的读取操作

    /*1. 在当前项目的根目录下有一个名为“info.txt”的文件,里面存放的内容如下(可手动创建录入,不需要使用IO流): 2. 利用IO流的知识读取info.txt文件的内容, 在控制台上打印大写 ...

  2. [转]JQuery 如何选择带有多个class的元素

    比如下面代码需要选择同时带有这几个class的元素,怎么写? 1 <div class="modal fade in"></div> A: 1. 依次过滤 ...

  3. 添加超级链接为什么用a标签

    a是anchor的简写,中文意思是锚点,而锚点的引申意思是连接,link已经被html占用了,只能用a来表示连接了.

  4. R: 聚类分析

    判别与聚类的比较: 聚类分析和判别分析有相似的作用,都是起到分类的作用. 判别分析是已知分类然后总结出判别规则,是一种有指导的学习: 聚类分析则是有了一批样本,不知道它们的分类,甚至连分成几类也不知道 ...

  5. conda 添加bioconda源,创建/删除/重命名环境

    1.conda安装 在https://repo.continuum.io/miniconda/选择conda版本 wget "https://repo.continuum.io/archiv ...

  6. NSSelectorFromString 使用示例

    NSSelectorFromString 动态加载实例方法. SEL sel = NSSelectorFromString(@"yourMethod:")//有参数 if([obj ...

  7. 后台传Map到ftl

    userInfo是后台传过来的Map <#list userInfo?keys as key> <tr > <td class="case_id" d ...

  8. Google androd性能优化经典

    2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...

  9. Android 中 吐司显示不出来的原因分析

    当你发现你的toast的show方法的确被执行了,但是却没有在界面中显示出来, 有问题的地方可能有两点: 1.Context上下文对象有问题,不是当前的上下文对象或者什么的: 2.message(即T ...

  10. c# get set 理解