# 测试模式 **分析日期:** 2026-02-28 ## 测试框架 **未检测到测试框架:** - 当前项目未包含测试项目 - 建议添加 xUnit、NUnit 或 MSTest **推荐配置:** - 框架:xUnit - Mock 库:Moq - 集成测试:Microsoft.AspNetCore.Mvc.Testing ## 测试文件组织 **建议结构:** ``` tests/ ├── Fengling.Console.Tests/ │ ├── Unit/ │ │ ├── Services/ │ │ └── Controllers/ │ └── Integration/ ``` ## 测试结构 **单元测试示例:** ```csharp public class UserServiceTests { private readonly Mock> _userManagerMock; private readonly UserService _userService; public UserServiceTests() { _userManagerMock = new Mock>(...); _userService = new UserService(...); } [Fact] public async Task GetUsersAsync_ReturnsPagedResults() { // Arrange var expectedUsers = new List { ... }; // Act var result = await _userService.GetUsersAsync(1, 10); // Assert Assert.Equal(expectedUsers.Count, result.TotalCount); } } ``` ## 模拟 (Mocking) **常用 Mock 库:** - Moq - 主流 Mock 框架 **Mock 对象:** ```csharp var mockUserManager = new Mock>( store: mockStore.Object, optionsAccessor: new Mock>().Object, passwordHasher: new Mock>().Object, validators: new List>(), keyNormalizer: new Mock().Object, errors: new IdentityErrorDescriber(), logger: new Mock>>().Object, services: new Mock().Object); ``` ## Fixture 和工厂 **测试数据:** - 使用静态工厂方法创建测试数据 - 每个测试方法独立,不共享状态 **示例:** ```csharp 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 ## 常见模式 **异步测试:** ```csharp [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); } ``` **异常测试:** ```csharp [Fact] public async Task CreateUserAsync_DuplicateUser_ThrowsException() { // Arrange var dto = TestData.CreateValidUserDto(); _userManagerMock .Setup(x => x.CreateAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(IdentityResult.Failed(new IdentityError { Description = "Duplicate" })); // Act & Assert await Assert.ThrowsAsync(() => _userService.CreateUserAsync(dto)); } ``` --- *测试分析:2026-02-28*