本篇体验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);
}
}
[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
}
}
}
[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);
}
}
如果把以下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);
}
}
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进行单元测试的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。
相关文章:
1. 虚机服务中常见Asp.Net低级错误一览2. ASP.NET Core整合Zipkin链路跟踪的实现方法3. .Net core 的热插拔机制的深入探索及卸载问题求救指南4. 在.NET Core 中使用 FluentValidation 进行规则验证的方法5. ASP.Net 自定义转换器JsonConverter的使用详解6. .NET Core 分布式任务调度ScheduleMaster详解7. ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程解析8. .NET Framework各版本(.NET2.0 3.0 3.5 4.0)区别9. asp.net生成HTML10. ASP.NET 2.0页面框架的几处变化