新增CncWebApi.Tests:14个控制器127个测试全部通过
- ControllerFactory:封装14个Controller的创建(含完整Repository→Service→Controller依赖链) - TestDb:测试数据库辅助(TruncateAll+SeedData+SetRealPasswordHash+辅助查询) - DatabaseCollection:xUnit串行测试集合(共享cnc_test库) - 14个Controller测试文件覆盖所有API端点: Health(1) + Auth(6) + Brand(15) + Machine(10) + CollectAddress(10) + Worker(13) + Dashboard(9) + Settings(15) + Production(6) + Alert(7) + Log(4) + ScreenConfig(12) + Screen(11) + Option(8) = 127个测试 - 直接实例化Controller调用方法,不经过HTTP管线 - 使用真实数据库(cnc_test库),与Service.Tests共享同一测试库main
parent
8845ffb3f6
commit
16016d0df7
@ -0,0 +1,85 @@
|
||||
using System;
|
||||
using CncModels.Dto;
|
||||
using CncModels.Dto.Log;
|
||||
using CncModels.Entity;
|
||||
using CncWebApi.Controllers;
|
||||
using Xunit;
|
||||
|
||||
namespace CncWebApi.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// LogController单元测试
|
||||
/// 系统日志 + 产量修正日志
|
||||
/// </summary>
|
||||
[Collection("Database")]
|
||||
public class LogControllerTests
|
||||
{
|
||||
private readonly LogController _controller;
|
||||
|
||||
public LogControllerTests()
|
||||
{
|
||||
TestDb.TruncateAll();
|
||||
_controller = ControllerFactory.CreateLogController();
|
||||
}
|
||||
|
||||
#region GetSystemLog - 系统日志
|
||||
|
||||
/// <summary>
|
||||
/// 测试:空数据库返回空列表
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetSystemLog_EmptyDb_ShouldReturnEmpty()
|
||||
{
|
||||
var result = _controller.GetSystemLog(new SystemLogQuery());
|
||||
var response = ControllerFactory.Extract<PagedResult<SystemLogListItem>>(result);
|
||||
ControllerFactory.AssertSuccess(response);
|
||||
Assert.Empty(response.Data.Items);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试:有日志数据时返回列表
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetSystemLog_WithData_ShouldReturnItems()
|
||||
{
|
||||
TestDb.Execute(@"INSERT INTO log_system (log_level, source, message, created_at)
|
||||
VALUES ('INFO', '测试模块', '测试内容', NOW())");
|
||||
|
||||
var result = _controller.GetSystemLog(new SystemLogQuery());
|
||||
var response = ControllerFactory.Extract<PagedResult<SystemLogListItem>>(result);
|
||||
Assert.NotEmpty(response.Data.Items);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetAdjustmentLog - 产量修正日志
|
||||
|
||||
/// <summary>
|
||||
/// 测试:空数据库返回空列表
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetAdjustmentLog_EmptyDb_ShouldReturnEmpty()
|
||||
{
|
||||
var result = _controller.GetAdjustmentLog(null, null, null, null, 1, 20);
|
||||
var response = ControllerFactory.Extract<PagedResult<ProductionAdjustment>>(result);
|
||||
ControllerFactory.AssertSuccess(response);
|
||||
Assert.Empty(response.Data.Items);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试:有修正日志时返回列表
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetAdjustmentLog_WithData_ShouldReturnItems()
|
||||
{
|
||||
TestDb.Execute(@"INSERT INTO cnc_production_adjustment (target_table, target_id, field_name, old_value, new_value, reason, created_at)
|
||||
VALUES ('cnc_daily_production', 1, 'total_quantity', 100, 200, '测试修正', NOW())");
|
||||
|
||||
var result = _controller.GetAdjustmentLog(null, null, null, null, 1, 20);
|
||||
var response = ControllerFactory.Extract<PagedResult<ProductionAdjustment>>(result);
|
||||
Assert.NotEmpty(response.Data.Items);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,204 @@
|
||||
using System.Collections.Generic;
|
||||
using CncModels.Constants;
|
||||
using CncModels.Dto;
|
||||
using CncModels.Dto.CollectAddress;
|
||||
using CncModels.Dto.Machine;
|
||||
using CncService;
|
||||
using CncWebApi.Controllers;
|
||||
using Xunit;
|
||||
|
||||
namespace CncWebApi.Tests
|
||||
{
|
||||
/// <summary>
|
||||
/// MachineController单元测试
|
||||
/// 机床CRUD + 启停
|
||||
/// </summary>
|
||||
[Collection("Database")]
|
||||
public class MachineControllerTests
|
||||
{
|
||||
private readonly MachineController _controller;
|
||||
|
||||
public MachineControllerTests()
|
||||
{
|
||||
TestDb.TruncateAll();
|
||||
// 预置一个采集地址(机床外键依赖)
|
||||
TestDb.Execute(@"INSERT INTO cnc_collect_address (name, url, brand_id, collect_interval, is_enabled, created_at, updated_at)
|
||||
VALUES ('测试地址', 'http://192.168.1.1', 1, 5, 1, NOW(), NOW())");
|
||||
_controller = ControllerFactory.CreateMachineController();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 辅助:创建机床请求
|
||||
/// </summary>
|
||||
private CreateMachineRequest CreateRequest(string code = "CNC001", string name = "机床1") => new CreateMachineRequest
|
||||
{
|
||||
DeviceCode = code,
|
||||
Name = name,
|
||||
WorkshopId = 1,
|
||||
CollectAddressId = 1,
|
||||
IpAddress = "192.168.1.100",
|
||||
BrandId = 1
|
||||
};
|
||||
|
||||
#region GetList - 机床列表
|
||||
|
||||
/// <summary>
|
||||
/// 测试:空数据库返回空列表
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetList_EmptyDb_ShouldReturnEmpty()
|
||||
{
|
||||
var result = _controller.GetList(new MachineQuery());
|
||||
var response = ControllerFactory.Extract<PagedResult<MachineListItem>>(result);
|
||||
ControllerFactory.AssertSuccess(response);
|
||||
Assert.Empty(response.Data.Items);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试:新增机床后列表有数据
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetList_AfterCreate_ShouldReturnOne()
|
||||
{
|
||||
_controller.Create(CreateRequest());
|
||||
var result = _controller.GetList(new MachineQuery());
|
||||
var response = ControllerFactory.Extract<PagedResult<MachineListItem>>(result);
|
||||
Assert.Single(response.Data.Items);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试:分页参数生效
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetList_Pagination_ShouldWork()
|
||||
{
|
||||
// 新增3台机床
|
||||
for (int i = 1; i <= 3; i++)
|
||||
_controller.Create(CreateRequest($"C{i:00}", $"机床{i}"));
|
||||
|
||||
var result = _controller.GetList(new MachineQuery { Page = 1, PageSize = 2 });
|
||||
var response = ControllerFactory.Extract<PagedResult<MachineListItem>>(result);
|
||||
Assert.Equal(2, response.Data.Items.Count);
|
||||
Assert.Equal(3, response.Data.Total);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region GetById - 机床详情
|
||||
|
||||
/// <summary>
|
||||
/// 测试:获取机床详情成功
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetById_Existing_ShouldReturnDetail()
|
||||
{
|
||||
_controller.Create(CreateRequest());
|
||||
int id = TestDb.QuerySingle<int>("SELECT MAX(id) FROM cnc_machine");
|
||||
|
||||
var result = _controller.GetById(id);
|
||||
var response = ControllerFactory.Extract<MachineDetailResponse>(result);
|
||||
ControllerFactory.AssertSuccess(response);
|
||||
Assert.Equal("CNC001", response.Data.DeviceCode);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试:获取不存在的机床抛出异常
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void GetById_NotExisting_ShouldThrow()
|
||||
{
|
||||
Assert.Throws<BusinessException>(() => _controller.GetById(999));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Create - 新增机床
|
||||
|
||||
/// <summary>
|
||||
/// 测试:新增机床成功
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Create_ValidRequest_ShouldReturnId()
|
||||
{
|
||||
var result = _controller.Create(CreateRequest());
|
||||
var response = ControllerFactory.Extract<object>(result);
|
||||
ControllerFactory.AssertSuccess(response);
|
||||
Assert.NotNull(response.Data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试:重复设备编码抛出异常
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Create_DuplicateCode_ShouldThrow()
|
||||
{
|
||||
_controller.Create(CreateRequest("CNC001", "机床1"));
|
||||
var ex = Assert.Throws<BusinessException>(() => _controller.Create(CreateRequest("CNC001", "机床2")));
|
||||
Assert.Equal("设备编码已存在", ex.Message);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Update - 编辑机床
|
||||
|
||||
/// <summary>
|
||||
/// 测试:编辑机床成功
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Update_ValidRequest_ShouldSuccess()
|
||||
{
|
||||
_controller.Create(CreateRequest());
|
||||
int id = TestDb.QuerySingle<int>("SELECT MAX(id) FROM cnc_machine");
|
||||
|
||||
var result = _controller.Update(id, new UpdateMachineRequest
|
||||
{
|
||||
Name = "机床已改名",
|
||||
WorkshopId = 1,
|
||||
CollectAddressId = 1,
|
||||
IpAddress = "192.168.1.200",
|
||||
BrandId = 1
|
||||
});
|
||||
|
||||
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
|
||||
var detail = ControllerFactory.Extract<MachineDetailResponse>(_controller.GetById(id));
|
||||
Assert.Equal("机床已改名", detail.Data.Name);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Delete - 删除机床
|
||||
|
||||
/// <summary>
|
||||
/// 测试:删除机床成功
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Delete_Existing_ShouldSuccess()
|
||||
{
|
||||
_controller.Create(CreateRequest());
|
||||
int id = TestDb.QuerySingle<int>("SELECT MAX(id) FROM cnc_machine");
|
||||
|
||||
var result = _controller.Delete(id);
|
||||
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
|
||||
Assert.Throws<BusinessException>(() => _controller.GetById(id));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region ToggleEnabled - 启停
|
||||
|
||||
/// <summary>
|
||||
/// 测试:切换机床启用状态
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void ToggleEnabled_ShouldSuccess()
|
||||
{
|
||||
_controller.Create(CreateRequest());
|
||||
int id = TestDb.QuerySingle<int>("SELECT MAX(id) FROM cnc_machine");
|
||||
|
||||
var result = _controller.ToggleEnabled(id);
|
||||
ControllerFactory.AssertSuccess(ControllerFactory.Extract<object>(result));
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue