.NET 单元测试

单元测试

.NET 单元测试是一种软件开发技术,用于验证代码是否按照预期工作。每个单元通常是一个独立的代码模块,例如一个方法或函数。单元测试的目标是确保每个单元都能正确执行其功能,从而提高代码的质量和可靠性。

单元测试的关键点:

  • 自动化:单元测试通常是自动化的,这意味着可以通过运行测试脚本来自动验证代码的功能。

  • 独立性:每个单元测试应独立于其他测试,确保测试结果不受其他代码部分的影响。

  • 可重复性:单元测试应能在不同时间和不同环境中重复运行并得到相同的结果。

断言(MSTest)

常用断言方法:

1
2
3
4
5
6
7
8
9
10
Assert.AreEqual() //验证两个值是否相等。
Assert.AreNotEqual() // 验证两个值是否不相等。
Assert.IsTrue() // 验证条件是否为 true。
Assert.IsFalse() // 验证条件是否为 false。
Assert.IsNull() // 验证对象是否为 null。
Assert.IsNotNull() // 验证对象是否不为 null。
Assert.AreSame() // 验证两个对象是否引用同一个对象。
Assert.AreNotSame() // 验证两个对象是否引用不同的对象。
Assert.Fail() // 使测试失败,并指定失败消息。
Assert.ThrowsException() // 验证是否抛出指定类型的异常。

Mocking

Mocking 指创建一个对象来模拟真实对象。为什么不用真实对象,需要模拟呢?因为有些真实对象是不容易构造或获取的。并且 Mocking 可以隔离测试中的依赖项,确保测试的独立性和稳定性。

使用 Moq

Moq 是一个流行的 .NET Mocking 框架,用于创建和管理模拟对象,验证方法调用、设置返回值等。

使用 Moq 的基本步骤:

  • 安装 Moq:在你的项目中安装 Moq 包(例如通过 NuGet)。
  • 创建 Mock 对象:使用 Moq 创建模拟对象。
  • 设置行为和返回值:配置模拟对象的行为和返回值。
  • 验证调用:在测试中验证模拟对象的方法是否被调用。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using Moq;
using Xunit;

// 依赖项接口
public interface IService
{
int GetValue();
}

// 被测试的类
public class Consumer
{
private readonly IService _service;

public Consumer(IService service)
{
_service = service;
}

public int GetProcessedValue()
{
var value = _service.GetValue();
return value * 2;
}
}

public class ConsumerTests
{
[Fact]
public void GetProcessedValue_ReturnsCorrectValue()
{
// 创建 Mock 对象
var mockService = new Mock<IService>();

// 设置 Mock 行为和返回值
mockService.Setup(s => s.GetValue()).Returns(10);

// 使用 Mock 对象创建 Consumer 实例
var consumer = new Consumer(mockService.Object);

// 调用被测试的方法
var result = consumer.GetProcessedValue();

// 验证结果
Assert.Equal(20, result);

// 验证 Mock 方法调用
mockService.Verify(s => s.GetValue(), Times.Once);
}
}

假数据生成器

  • AutoFixture
  • Bogus