第一篇文章, 关于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. js 操作属性,操作内容,

    disable=“disable” 让按钮变得不可选 先建一个按钮,让class = ’btn‘ 然后, 添加,修改属性 document.getElementsByClassName('btn')[ ...

  2. String/StringBuilder 类 判断QQ号码

    1.1. 训练描述:[方法.String类]  一.需求说明:请用户输入一个“QQ号码”,我们来判断这个QQ号码是否正确. 要求:使用方法来完成判断功能. 1.2. 操作步骤描述 建立MainApp类 ...

  3. 阿里云 linux搭建git服务器

    git是非常方便的版本控制工具,目前网上有很多免费的git仓库可以给我们使用,但是有些时候我们并不放心将我们的项目寄放在别人的服务器上,这个时候就需要自己搭建一个git服务器. 在linux上面搭建g ...

  4. 100211D Police Cities

    传送门 分析 看到这个题我们的第一反应自然是Tarjan缩点,在这之后我们可以发现实际只要在缩点之后所有出度或入度为0的点布置警察局就可以达到要求,我们用dpij表示考虑前i个出度或入度为0的点共布置 ...

  5. Entity Framework Tutorial Basics(32):Enum Support

    Enum in Entity Framework: You can now have an Enum in Entity Framework 5.0 onwards. EF 5 should targ ...

  6. PartyLocation.get请求

    1.PartyLocationDto:partyDto 2.PartyLocationConverter: 3.PartyDto:Public PartyDto 4.PartyLocationToPa ...

  7. css 隐藏html元素的方法

    1.常见方法 display:none 这个方法的问题是 元素被隐藏了 同时该元素不占位置了,应该也可以说该元素没有高度和宽度了 2.常见方法 visibility: hidden; 这个方法和dis ...

  8. mysql 远程登录与表名大小写问题

    好久没写博客了,这段时间在学习一个开源的项目,里面使用到了mysql,好久没使用mysql了.在使用过程中遇到了一个问题,远程登陆.报错信息很明显,连接失败.解决思路如下: 1. 首先检查到服务器网络 ...

  9. Django会话,用户和注册之cookie

    HTTP状态和TCP不一样,HTTP是无状态的,也就是这一次请求和下一次请求之间没有任何状态保持,我们无法根据请求例如IP来识别是否在同一人的连续性请求.就像我们在访问网站的时候,输入了用户名和密码, ...

  10. Struct结构体

    1.结构体的定义与调用 // 定义结构体类型 // 结构体类型名为 MyDate1 struct MyDate1 { int year; int month; int day; }; // 定义结构体 ...