- STACK.md - 技术栈和依赖 - INTEGRATIONS.md - 外部集成 - ARCHITECTURE.md - 架构设计 - STRUCTURE.md - 代码库结构 - CONVENTIONS.md - 编码规范 - TESTING.md - 测试模式 - CONCERNS.md - 技术债务和问题
3.3 KiB
3.3 KiB
测试模式
分析日期: 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