using GFramework.Core.Abstractions.query; using GFramework.Core.query; using NUnit.Framework; namespace GFramework.Core.Tests.query; /// /// AsyncQueryBus类的单元测试 /// 测试内容包括: /// - SendAsync方法 - 正常查询发送 /// - SendAsync方法 - 空查询异常 /// - 异步查询结果正确性 /// - 不同返回类型的异步查询支持 /// - 异步查询的异常处理 /// - 异步查询的上下文传递 /// [TestFixture] public class AsyncQueryExecutorTests { [SetUp] public void SetUp() { _asyncQueryExecutor = new AsyncQueryExecutor(); } private AsyncQueryExecutor _asyncQueryExecutor = null!; /// /// 测试SendAsync方法正确返回查询结果 /// [Test] public async Task SendAsync_Should_Return_Query_Result() { var input = new TestAsyncQueryInput { Value = 10 }; var query = new TestAsyncQuery(input); var result = await _asyncQueryExecutor.SendAsync(query); Assert.That(result, Is.EqualTo(20)); } /// /// 测试SendAsync方法在传入空查询对象时是否会抛出ArgumentNullException异常 /// [Test] public void SendAsync_WithNullQuery_Should_ThrowArgumentNullException() { Assert.ThrowsAsync(async () => await _asyncQueryExecutor.SendAsync(null!)); } /// /// 测试SendAsync方法是否能正确返回字符串类型的查询结果 /// [Test] public async Task SendAsync_WithStringResult_Should_Return_String() { var input = new TestAsyncQueryInput { Value = 5 }; var query = new TestAsyncStringQuery(input); var result = await _asyncQueryExecutor.SendAsync(query); Assert.That(result, Is.EqualTo("Result: 10")); } /// /// 测试SendAsync方法是否能正确返回布尔类型的查询结果 /// [Test] public async Task SendAsync_WithBooleanResult_Should_Return_Boolean() { var input = new TestAsyncQueryInput { Value = 42 }; var query = new TestAsyncBooleanQuery(input); var result = await _asyncQueryExecutor.SendAsync(query); Assert.That(result, Is.True); } /// /// 测试SendAsync方法是否能正确处理复杂对象的查询结果 /// [Test] public async Task SendAsync_WithComplexObjectResult_Should_Return_ComplexObject() { var input = new TestAsyncQueryInput { Value = 100 }; var query = new TestAsyncComplexQuery(input); var result = await _asyncQueryExecutor.SendAsync(query); Assert.That(result, Is.Not.Null); Assert.That(result.Value, Is.EqualTo(200)); Assert.That(result.DoubleValue, Is.EqualTo(300)); } /// /// 测试SendAsync方法是否能正确处理抛出异常的查询 /// [Test] public void SendAsync_Should_Propagate_Exception_From_Query() { var input = new TestAsyncQueryInput { Value = 0 }; var query = new TestAsyncQueryWithException(input); Assert.ThrowsAsync(async () => await _asyncQueryExecutor.SendAsync(query)); } /// /// 测试SendAsync方法多次调用 /// [Test] public async Task SendAsync_Should_Be_Callable_Multiple_Times() { var input = new TestAsyncQueryInput { Value = 10 }; var query = new TestAsyncQuery(input); var result1 = await _asyncQueryExecutor.SendAsync(query); var result2 = await _asyncQueryExecutor.SendAsync(query); Assert.That(result1, Is.EqualTo(20)); Assert.That(result2, Is.EqualTo(20)); } /// /// 测试SendAsync方法在不同查询之间保持独立性 /// [Test] public async Task SendAsync_Should_Maintain_Independence_Between_Different_Queries() { var input1 = new TestAsyncQueryInput { Value = 10 }; var input2 = new TestAsyncQueryInput { Value = 20 }; var query1 = new TestAsyncQuery(input1); var query2 = new TestAsyncQuery(input2); var result1 = await _asyncQueryExecutor.SendAsync(query1); var result2 = await _asyncQueryExecutor.SendAsync(query2); Assert.That(result1, Is.EqualTo(20)); Assert.That(result2, Is.EqualTo(40)); } } /// /// 测试用异步查询输入类,实现IQueryInput接口 /// public sealed class TestAsyncQueryInput : IQueryInput { /// /// 获取或设置查询值 /// public int Value { get; init; } } /// /// 整数类型测试异步查询类,继承AbstractAsyncQuery /// 实现具体的异步查询逻辑并返回整数结果 /// public sealed class TestAsyncQuery : AbstractAsyncQuery { /// /// 初始化TestAsyncQuery的新实例 /// /// 查询输入参数 public TestAsyncQuery(TestAsyncQueryInput input) : base(input) { } /// /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 查询结果,将输入值乘以2 protected override Task OnDoAsync(TestAsyncQueryInput input) { return Task.FromResult(input.Value * 2); } } /// /// 字符串类型测试异步查询类,继承AbstractAsyncQuery /// 实现具体的异步查询逻辑并返回字符串结果 /// public sealed class TestAsyncStringQuery : AbstractAsyncQuery { /// /// 初始化TestAsyncStringQuery的新实例 /// /// 查询输入参数 public TestAsyncStringQuery(TestAsyncQueryInput input) : base(input) { } /// /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 格式化的字符串结果 protected override Task OnDoAsync(TestAsyncQueryInput input) { return Task.FromResult($"Result: {input.Value * 2}"); } } /// /// 布尔类型测试异步查询类,继承AbstractAsyncQuery /// 实现具体的异步查询逻辑并返回布尔结果 /// public sealed class TestAsyncBooleanQuery : AbstractAsyncQuery { /// /// 初始化TestAsyncBooleanQuery的新实例 /// /// 查询输入参数 public TestAsyncBooleanQuery(TestAsyncQueryInput input) : base(input) { } /// /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 如果值大于0返回true,否则返回false protected override Task OnDoAsync(TestAsyncQueryInput input) { return Task.FromResult(input.Value > 0); } } /// /// 复杂对象类型测试异步查询类,继承AbstractAsyncQuery /// 实现具体的异步查询逻辑并返回复杂对象结果 /// public sealed class TestAsyncComplexQuery : AbstractAsyncQuery { /// /// 初始化TestAsyncComplexQuery的新实例 /// /// 查询输入参数 public TestAsyncComplexQuery(TestAsyncQueryInput input) : base(input) { } /// /// 执行异步查询操作的具体实现 /// /// 查询输入参数 /// 复杂对象查询结果 protected override Task OnDoAsync(TestAsyncQueryInput input) { var result = new TestAsyncQueryResult { Value = input.Value * 2, DoubleValue = input.Value * 3 }; return Task.FromResult(result); } } /// /// 测试用异步查询类(抛出异常) /// public sealed class TestAsyncQueryWithException : AbstractAsyncQuery { /// /// 初始化TestAsyncQueryWithException的新实例 /// /// 查询输入参数 public TestAsyncQueryWithException(TestAsyncQueryInput input) : base(input) { } /// /// 执行异步查询操作并抛出异常 /// /// 查询输入参数 /// 总是抛出异常 protected override Task OnDoAsync(TestAsyncQueryInput input) { throw new InvalidOperationException("Test exception"); } } /// /// 测试用复杂查询结果类 /// public sealed class TestAsyncQueryResult { /// /// 获取或设置值 /// public int Value { get; init; } /// /// 获取或设置双倍值 /// public int DoubleValue { get; init; } }