单元测试
.NET 单元测试是一种软件开发技术,用于验证代码是否按照预期工作。每个单元通常是一个独立的代码模块,例如一个方法或函数。单元测试的目标是确保每个单元都能正确执行其功能,从而提高代码的质量和可靠性。
单元测试的关键点:
-
自动化:单元测试通常是自动化的,这意味着可以通过运行测试脚本来自动验证代码的功能。
-
独立性:每个单元测试应独立于其他测试,确保测试结果不受其他代码部分的影响。
-
可重复性:单元测试应能在不同时间和不同环境中重复运行并得到相同的结果。
断言(MSTest)
常用断言方法:
1Assert.AreEqual() //验证两个值是否相等。2Assert.AreNotEqual() // 验证两个值是否不相等。3Assert.IsTrue() // 验证条件是否为 true。4Assert.IsFalse() // 验证条件是否为 false。5Assert.IsNull() // 验证对象是否为 null。6Assert.IsNotNull() // 验证对象是否不为 null。7Assert.AreSame() // 验证两个对象是否引用同一个对象。8Assert.AreNotSame() // 验证两个对象是否引用不同的对象。9Assert.Fail() // 使测试失败,并指定失败消息。10Assert.ThrowsException() // 验证是否抛出指定类型的异常。Mocking
Mocking 指创建一个对象来模拟真实对象。为什么不用真实对象,需要模拟呢?因为有些真实对象是不容易构造或获取的。并且 Mocking 可以隔离测试中的依赖项,确保测试的独立性和稳定性。
使用 Moq
Moq 是一个流行的 .NET Mocking 框架,用于创建和管理模拟对象,验证方法调用、设置返回值等。
使用 Moq 的基本步骤:
- 安装 Moq:在你的项目中安装 Moq 包(例如通过 NuGet)。
- 创建 Mock 对象:使用 Moq 创建模拟对象。
- 设置行为和返回值:配置模拟对象的行为和返回值。
- 验证调用:在测试中验证模拟对象的方法是否被调用。
示例代码:
1using Moq;2using Xunit;3
4// 依赖项接口5public interface IService6{7 int GetValue();8}9
10// 被测试的类11public class Consumer12{13 private readonly IService _service;14
15 public Consumer(IService service)35 collapsed lines
16 {17 _service = service;18 }19
20 public int GetProcessedValue()21 {22 var value = _service.GetValue();23 return value * 2;24 }25}26
27public class ConsumerTests28{29 [Fact]30 public void GetProcessedValue_ReturnsCorrectValue()31 {32 // 创建 Mock 对象33 var mockService = new Mock<IService>();34
35 // 设置 Mock 行为和返回值36 mockService.Setup(s => s.GetValue()).Returns(10);37
38 // 使用 Mock 对象创建 Consumer 实例39 var consumer = new Consumer(mockService.Object);40
41 // 调用被测试的方法42 var result = consumer.GetProcessedValue();43
44 // 验证结果45 Assert.Equal(20, result);46
47 // 验证 Mock 方法调用48 mockService.Verify(s => s.GetValue(), Times.Once);49 }50}假数据生成器
- AutoFixture
- Bogus