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