154 lines
4.3 KiB
C#
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)
|
|
{
|
|
}
|
|
}
|