Files
OrpaonVision/OrpaonVision.Core/Testing/TestBase.cs
2026-04-06 22:04:05 +08:00

154 lines
4.3 KiB
C#

using OrpaonVision.Core.Results;
namespace OrpaonVision.Core.Testing;
/// <summary>
/// 测试基类。
/// </summary>
public abstract class TestBase
{
/// <summary>
/// 测试上下文。
/// </summary>
protected ITestContext TestContext { get; private set; } = null!;
/// <summary>
/// 初始化测试。
/// </summary>
/// <param name="testContext">测试上下文。</param>
protected virtual void Initialize(ITestContext testContext)
{
TestContext = testContext;
}
/// <summary>
/// 清理测试。
/// </summary>
protected virtual void Cleanup()
{
// 清理资源
}
/// <summary>
/// 创建模拟服务。
/// </summary>
/// <typeparam name="T">服务类型。</typeparam>
/// <returns>模拟服务实例。</returns>
protected virtual T CreateMockService<T>() where T : class
{
return TestContext.CreateMock<T>();
}
/// <summary>
/// 创建测试数据。
/// </summary>
/// <typeparam name="T">数据类型。</typeparam>
/// <returns>测试数据实例。</returns>
protected virtual T CreateTestData<T>() where T : class, new()
{
return TestContext.CreateTestData<T>();
}
/// <summary>
/// 断言结果成功。
/// </summary>
/// <typeparam name="T">结果类型。</typeparam>
/// <param name="result">结果对象。</param>
/// <param name="message">断言消息。</param>
protected virtual void AssertSuccess<T>(Result<T> result, string? message = null)
{
if (!result.Succeeded)
{
throw new AssertException(message ?? $"Expected success but got failure: {result.Message}");
}
}
/// <summary>
/// 断言结果失败。
/// </summary>
/// <typeparam name="T">结果类型。</typeparam>
/// <param name="result">结果对象。</param>
/// <param name="expectedErrorCode">期望的错误代码。</param>
/// <param name="message">断言消息。</param>
protected virtual void AssertFailure<T>(Result<T> result, string? expectedErrorCode = null, string? message = null)
{
if (result.Succeeded)
{
throw new AssertException(message ?? "Expected failure but got success");
}
if (expectedErrorCode != null && result.Code != expectedErrorCode)
{
throw new AssertException(message ?? $"Expected error code {expectedErrorCode} but got {result.Code}");
}
}
/// <summary>
/// 断言非空。
/// </summary>
/// <param name="value">值。</param>
/// <param name="paramName">参数名称。</param>
protected virtual void AssertNotNull(object? value, string? paramName = null)
{
if (value == null)
{
throw new AssertException($"Expected not null value for parameter {paramName}");
}
}
/// <summary>
/// 断言相等。
/// </summary>
/// <param name="expected">期望值。</param>
/// <param name="actual">实际值。</param>
/// <param name="message">断言消息。</param>
protected virtual void AssertEquals(object? expected, object? actual, string? message = null)
{
if (!Equals(expected, actual))
{
throw new AssertException(message ?? $"Expected {expected} but got {actual}");
}
}
}
/// <summary>
/// 测试上下文接口。
/// </summary>
public interface ITestContext
{
/// <summary>
/// 创建模拟对象。
/// </summary>
/// <typeparam name="T">类型。</typeparam>
/// <returns>模拟对象。</returns>
T CreateMock<T>() where T : class;
/// <summary>
/// 创建测试数据。
/// </summary>
/// <typeparam name="T">数据类型。</typeparam>
/// <returns>测试数据。</returns>
T CreateTestData<T>() where T : class, new();
/// <summary>
/// 获取测试配置。
/// </summary>
/// <typeparam name="T">配置类型。</typeparam>
/// <returns>配置实例。</returns>
T GetConfiguration<T>() where T : class, new();
}
/// <summary>
/// 断言异常。
/// </summary>
public class AssertException : Exception
{
public AssertException(string message) : base(message)
{
}
public AssertException(string message, Exception innerException) : base(message, innerException)
{
}
}