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

145 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 测试模式
**分析日期:** 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<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 对象:**
```csharp
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 和工厂
**测试数据:**
- 使用静态工厂方法创建测试数据
- 每个测试方法独立,不共享状态
**示例:**
```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<ApplicationUser>(), It.IsAny<string>()))
.ReturnsAsync(IdentityResult.Failed(new IdentityError { Description = "Duplicate" }));
// Act & Assert
await Assert.ThrowsAsync<InvalidOperationException>(() =>
_userService.CreateUserAsync(dto));
}
```
---
*测试分析2026-02-28*