fengling-console/.planning/codebase/TESTING.md
movingsam b8d2a93c9f docs: 添加代码库分析文档(中文)
- STACK.md - 技术栈和依赖
- INTEGRATIONS.md - 外部集成
- ARCHITECTURE.md - 架构设计
- STRUCTURE.md - 代码库结构
- CONVENTIONS.md - 编码规范
- TESTING.md - 测试模式
- CONCERNS.md - 技术债务和问题
2026-02-28 18:38:17 +08:00

3.3 KiB
Raw Blame History

测试模式

分析日期: 2026-02-28

测试框架

未检测到测试框架:

  • 当前项目未包含测试项目
  • 建议添加 xUnit、NUnit 或 MSTest

推荐配置:

  • 框架xUnit
  • Mock 库Moq
  • 集成测试Microsoft.AspNetCore.Mvc.Testing

测试文件组织

建议结构:

tests/
├── Fengling.Console.Tests/
│   ├── Unit/
│   │   ├── Services/
│   │   └── Controllers/
│   └── Integration/

测试结构

单元测试示例:

public class UserServiceTests
{
    private readonly Mock<UserManager<ApplicationUser>> _userManagerMock;
    private readonly UserService _userService;

    public UserServiceTests()
    {
        _userManagerMock = new Mock<UserManager<ApplicationUser>>(...);
        _userService = new UserService(...);
    }

    [Fact]
    public async Task GetUsersAsync_ReturnsPagedResults()
    {
        // Arrange
        var expectedUsers = new List<UserDto> { ... };
        
        // Act
        var result = await _userService.GetUsersAsync(1, 10);
        
        // Assert
        Assert.Equal(expectedUsers.Count, result.TotalCount);
    }
}

模拟 (Mocking)

常用 Mock 库:

  • Moq - 主流 Mock 框架

Mock 对象:

var mockUserManager = new Mock<UserManager<ApplicationUser>>(
    store: mockStore.Object,
    optionsAccessor: new Mock<IOptions<IdentityOptions>>().Object,
    passwordHasher: new Mock<IPasswordHasher<ApplicationUser>>().Object,
    validators: new List<IUserValidator<ApplicationUser>>(),
    keyNormalizer: new Mock<ILookupNormalizer>().Object,
    errors: new IdentityErrorDescriber(),
    logger: new Mock<ILogger<UserManager<ApplicationUser>>>().Object,
    services: new Mock<IServiceProvider>().Object);

Fixture 和工厂

测试数据:

  • 使用静态工厂方法创建测试数据
  • 每个测试方法独立,不共享状态

示例:

public static class TestData
{
    public static CreateUserDto CreateValidUserDto() => new CreateUserDto
    {
        UserName = "testuser",
        Email = "test@example.com",
        Password = "Test@123456",
        RealName = "Test User"
    };
}

测试类型

单元测试:

  • 范围Service 层业务逻辑
  • 重点:边界条件、异常处理

集成测试:

  • 范围Controller API 端点
  • 使用Microsoft.AspNetCore.Mvc.Testing

常见模式

异步测试:

[Fact]
public async Task CreateUserAsync_ValidInput_ReturnsCreatedUser()
{
    // Arrange
    var dto = TestData.CreateValidUserDto();
    
    // Act
    var result = await _userService.CreateUserAsync(dto);
    
    // Assert
    Assert.NotNull(result);
    Assert.Equal(dto.UserName, result.UserName);
}

异常测试:

[Fact]
public async Task CreateUserAsync_DuplicateUser_ThrowsException()
{
    // Arrange
    var dto = TestData.CreateValidUserDto();
    _userManagerMock
        .Setup(x => x.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
        .ReturnsAsync(IdentityResult.Failed(new IdentityError { Description = "Duplicate" }));
    
    // Act & Assert
    await Assert.ThrowsAsync<InvalidOperationException>(() => 
        _userService.CreateUserAsync(dto));
}

测试分析2026-02-28