Arrange-Act-Assert(简称AAA)是一种编写单元测试的标准模式,具有清晰的结构和明确的步骤,有助于提高测试的可读性、可维护性和可扩展性。以下是对每个步骤的详细说明:
1. Arrange(准备阶段)
在这一阶段,你需要设置测试所需的环境,包括但不限于:
- 初始化被测对象。
- 创建模拟对象或存根(如果需要的话)。
- 设置输入数据或配置被测对象的状态。
示例:
cs
// 创建并配置模拟对象
var mockRepository = Substitute.For<IRepository>();
mockRepository.SaveOrder(Arg.Any<Order>()).Returns(true);
// 初始化被测对象
var orderService = new OrderService(mockRepository);
2. Act(执行阶段)
这是测试的核心部分,在这里你调用被测对象的方法或执行你想要验证的行为。这个步骤应该是直接且单一的,理想情况下只包含一个动作。
示例:
cs
// 调用被测方法
var result = orderService.ProcessOrder(new Order { Id = 1, Description = "Test Order" });
3. Assert(断言阶段)
在最后一步中,你将验证执行阶段的结果是否符合预期。这可能包括检查返回值、状态变化或确认某些行为(如方法调用)确实发生了。
示例:
cs
// 验证结果
Assert.Equal("Order saved successfully!", result);
mockRepository.Received().SaveOrder(Arg.Any<Order>()); // 确认 SaveOrder 方法被调用
完整示例
结合上述各部分,这里有一个完整的使用 Arrange-Act-Assert 模式的单元测试示例:
cs
using NSubstitute;
using Xunit;
public class OrderServiceTests
{
[Fact]
public void ProcessOrder_ShouldReturnSuccess_WhenSaveOrderSucceeds()
{
// Arrange
var mockRepository = Substitute.For<IRepository>();
mockRepository.SaveOrder(Arg.Any<Order>()).Returns(true); // 准备:设置模拟对象行为
var orderService = new OrderService(mockRepository); // 准备:初始化被测对象
var testOrder = new Order { Id = 1, Description = "Test Order" }; // 准备:设置输入数据
// Act
var result = orderService.ProcessOrder(testOrder); // 执行:调用被测方法
// Assert
Assert.Equal("Order saved successfully!", result); // 断言:验证返回值
mockRepository.Received().SaveOrder(testOrder); // 断言:验证 SaveOrder 方法被调用
}
}
通过遵循 AAA 模式,你的测试会变得更加结构化和清晰,不仅有助于你自己理解和维护代码,也能让其他开发者更容易地阅读和贡献代码。