mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-13 22:25:37 +08:00
test(cqrs): 清理 Mediator 架构集成测试警告
- 优化 Mediator 架构集成测试的 helper 类型作用域,消除文件名与类型名警告 - 补充异步测试路径的 ConfigureAwait(false),满足 analyzer 要求 - 更新测试集合暴露类型为只读或抽象集合,保留行为不变
This commit is contained in:
parent
0e32dab4a2
commit
ed269d4a34
@ -62,7 +62,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
TestContextAwareHandler.LastContext = _context; // 直接设置
|
TestContextAwareHandler.LastContext = _context; // 直接设置
|
||||||
var request = new TestContextAwareRequest();
|
var request = new TestContextAwareRequest();
|
||||||
|
|
||||||
await _context!.SendRequestAsync(request);
|
await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
|
|
||||||
Assert.That(TestContextAwareHandler.LastContext, Is.Not.Null);
|
Assert.That(TestContextAwareHandler.LastContext, Is.Not.Null);
|
||||||
Assert.That(TestContextAwareHandler.LastContext, Is.SameAs(_context));
|
Assert.That(TestContextAwareHandler.LastContext, Is.SameAs(_context));
|
||||||
@ -74,7 +74,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
TestServiceRetrievalHandler.LastRetrievedService = null;
|
TestServiceRetrievalHandler.LastRetrievedService = null;
|
||||||
var request = new TestServiceRetrievalRequest();
|
var request = new TestServiceRetrievalRequest();
|
||||||
|
|
||||||
await _context!.SendRequestAsync(request);
|
await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
|
|
||||||
Assert.That(TestServiceRetrievalHandler.LastRetrievedService, Is.Not.Null);
|
Assert.That(TestServiceRetrievalHandler.LastRetrievedService, Is.Not.Null);
|
||||||
Assert.That(TestServiceRetrievalHandler.LastRetrievedService, Is.InstanceOf<TestService>());
|
Assert.That(TestServiceRetrievalHandler.LastRetrievedService, Is.InstanceOf<TestService>());
|
||||||
@ -86,7 +86,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
TestNestedRequestHandler2.ExecutionCount = 0;
|
TestNestedRequestHandler2.ExecutionCount = 0;
|
||||||
var request = new TestNestedRequest { Depth = 1 }; // 简化为深度1
|
var request = new TestNestedRequest { Depth = 1 }; // 简化为深度1
|
||||||
|
|
||||||
var result = await _context!.SendRequestAsync(request);
|
var result = await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
|
|
||||||
Assert.That(result, Is.EqualTo("Nested execution completed at depth 1"));
|
Assert.That(result, Is.EqualTo("Nested execution completed at depth 1"));
|
||||||
Assert.That(TestNestedRequestHandler2.ExecutionCount, Is.EqualTo(1));
|
Assert.That(TestNestedRequestHandler2.ExecutionCount, Is.EqualTo(1));
|
||||||
@ -99,7 +99,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
TestLifecycleHandler.DisposalCount = 0;
|
TestLifecycleHandler.DisposalCount = 0;
|
||||||
|
|
||||||
var request = new TestLifecycleRequest();
|
var request = new TestLifecycleRequest();
|
||||||
await _context!.SendRequestAsync(request);
|
await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
|
|
||||||
// 验证生命周期管理
|
// 验证生命周期管理
|
||||||
Assert.That(TestLifecycleHandler.InitializationCount, Is.EqualTo(1));
|
Assert.That(TestLifecycleHandler.InitializationCount, Is.EqualTo(1));
|
||||||
@ -116,14 +116,14 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
.Select(async i =>
|
.Select(async i =>
|
||||||
{
|
{
|
||||||
var request = new TestScopedServiceRequest { RequestId = i };
|
var request = new TestScopedServiceRequest { RequestId = i };
|
||||||
var result = await _context!.SendRequestAsync(request);
|
var result = await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
lock (results)
|
lock (results)
|
||||||
{
|
{
|
||||||
results.Add(result);
|
results.Add(result);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
await Task.WhenAll(tasks);
|
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||||
|
|
||||||
// 验证每个请求都得到了独立的scope实例
|
// 验证每个请求都得到了独立的scope实例
|
||||||
Assert.That(results.Distinct().Count(), Is.EqualTo(10));
|
Assert.That(results.Distinct().Count(), Is.EqualTo(10));
|
||||||
@ -135,7 +135,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
var request = new TestErrorPropagationRequest();
|
var request = new TestErrorPropagationRequest();
|
||||||
|
|
||||||
var ex = Assert.ThrowsAsync<InvalidOperationException>(async () =>
|
var ex = Assert.ThrowsAsync<InvalidOperationException>(async () =>
|
||||||
await _context!.SendRequestAsync(request));
|
await _context!.SendRequestAsync(request).ConfigureAwait(false));
|
||||||
|
|
||||||
Assert.That(ex!.Message, Is.EqualTo("Test error from handler"));
|
Assert.That(ex!.Message, Is.EqualTo("Test error from handler"));
|
||||||
Assert.That(ex.Data["RequestId"], Is.Not.Null);
|
Assert.That(ex.Data["RequestId"], Is.Not.Null);
|
||||||
@ -148,7 +148,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
var request = new TestExceptionRequest();
|
var request = new TestExceptionRequest();
|
||||||
|
|
||||||
Assert.ThrowsAsync<DivideByZeroException>(async () =>
|
Assert.ThrowsAsync<DivideByZeroException>(async () =>
|
||||||
await _context!.SendRequestAsync(request));
|
await _context!.SendRequestAsync(request).ConfigureAwait(false));
|
||||||
|
|
||||||
// 验证异常被捕获和记录
|
// 验证异常被捕获和记录
|
||||||
Assert.That(TestExceptionHandler.LastException, Is.Not.Null);
|
Assert.That(TestExceptionHandler.LastException, Is.Not.Null);
|
||||||
@ -164,7 +164,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
for (int i = 0; i < iterations; i++)
|
for (int i = 0; i < iterations; i++)
|
||||||
{
|
{
|
||||||
var request = new TestPerformanceRequest2 { Id = i };
|
var request = new TestPerformanceRequest2 { Id = i };
|
||||||
var result = await _context!.SendRequestAsync(request);
|
var result = await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
Assert.That(result, Is.EqualTo(i));
|
Assert.That(result, Is.EqualTo(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,7 +188,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
{
|
{
|
||||||
var stopwatch = Stopwatch.StartNew();
|
var stopwatch = Stopwatch.StartNew();
|
||||||
var request = new TestUncachedRequest { Id = i };
|
var request = new TestUncachedRequest { Id = i };
|
||||||
await _context!.SendRequestAsync(request);
|
await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
stopwatch.Stop();
|
stopwatch.Stop();
|
||||||
uncachedTimes.Add(stopwatch.ElapsedMilliseconds);
|
uncachedTimes.Add(stopwatch.ElapsedMilliseconds);
|
||||||
}
|
}
|
||||||
@ -198,7 +198,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
{
|
{
|
||||||
var stopwatch = Stopwatch.StartNew();
|
var stopwatch = Stopwatch.StartNew();
|
||||||
var request = new TestCachedRequest { Id = i };
|
var request = new TestCachedRequest { Id = i };
|
||||||
await _context!.SendRequestAsync(request);
|
await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
stopwatch.Stop();
|
stopwatch.Stop();
|
||||||
cachedTimes.Add(stopwatch.ElapsedMilliseconds);
|
cachedTimes.Add(stopwatch.ElapsedMilliseconds);
|
||||||
}
|
}
|
||||||
@ -224,12 +224,12 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
var task = Task.Run(async () =>
|
var task = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
var request = new TestConcurrentRequest { RequestId = requestId, OrderTracker = executionOrder };
|
var request = new TestConcurrentRequest { RequestId = requestId, OrderTracker = executionOrder };
|
||||||
return await _context!.SendRequestAsync(request);
|
return await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
});
|
});
|
||||||
tasks.Add(task);
|
tasks.Add(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
var results = await Task.WhenAll(tasks);
|
var results = await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||||
|
|
||||||
// 验证所有请求都成功完成
|
// 验证所有请求都成功完成
|
||||||
Assert.That(results.Length, Is.EqualTo(concurrentRequests));
|
Assert.That(results.Length, Is.EqualTo(concurrentRequests));
|
||||||
@ -253,10 +253,10 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
SharedState = sharedState,
|
SharedState = sharedState,
|
||||||
Increment = 1
|
Increment = 1
|
||||||
};
|
};
|
||||||
await _context!.SendRequestAsync(request);
|
await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
await Task.WhenAll(tasks);
|
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||||
|
|
||||||
// 验证最终状态正确(20个并发操作,每个+1)
|
// 验证最终状态正确(20个并发操作,每个+1)
|
||||||
Assert.That(sharedState.Counter, Is.EqualTo(concurrentOperations));
|
Assert.That(sharedState.Counter, Is.EqualTo(concurrentOperations));
|
||||||
@ -269,7 +269,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
TestIntegrationHandler.LastSystemCall = null;
|
TestIntegrationHandler.LastSystemCall = null;
|
||||||
var request = new TestIntegrationRequest();
|
var request = new TestIntegrationRequest();
|
||||||
|
|
||||||
var result = await _context!.SendRequestAsync(request);
|
var result = await _context!.SendRequestAsync(request).ConfigureAwait(false);
|
||||||
|
|
||||||
Assert.That(result, Is.EqualTo("Integration successful"));
|
Assert.That(result, Is.EqualTo("Integration successful"));
|
||||||
Assert.That(TestIntegrationHandler.LastSystemCall, Is.EqualTo("System executed"));
|
Assert.That(TestIntegrationHandler.LastSystemCall, Is.EqualTo("System executed"));
|
||||||
@ -285,7 +285,7 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
|
|
||||||
// 使用Mediator
|
// 使用Mediator
|
||||||
var mediatorRequest = new TestMediatorRequest { Value = 42 };
|
var mediatorRequest = new TestMediatorRequest { Value = 42 };
|
||||||
var result = await _context.SendRequestAsync(mediatorRequest);
|
var result = await _context.SendRequestAsync(mediatorRequest).ConfigureAwait(false);
|
||||||
Assert.That(result, Is.EqualTo(42));
|
Assert.That(result, Is.EqualTo(42));
|
||||||
|
|
||||||
// 验证两者可以共存
|
// 验证两者可以共存
|
||||||
@ -296,8 +296,8 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
[Test]
|
[Test]
|
||||||
public async Task ContextAware_Handler_Should_Use_A_Fresh_Instance_Per_Request()
|
public async Task ContextAware_Handler_Should_Use_A_Fresh_Instance_Per_Request()
|
||||||
{
|
{
|
||||||
var firstResult = await _context!.SendRequestAsync(new TestPerDispatchContextAwareRequest());
|
var firstResult = await _context!.SendRequestAsync(new TestPerDispatchContextAwareRequest()).ConfigureAwait(false);
|
||||||
var secondResult = await _context.SendRequestAsync(new TestPerDispatchContextAwareRequest());
|
var secondResult = await _context.SendRequestAsync(new TestPerDispatchContextAwareRequest()).ConfigureAwait(false);
|
||||||
|
|
||||||
Assert.Multiple(() =>
|
Assert.Multiple(() =>
|
||||||
{
|
{
|
||||||
@ -306,8 +306,6 @@ public class MediatorArchitectureIntegrationTests
|
|||||||
Assert.That(TestPerDispatchContextAwareHandler.Contexts, Has.All.SameAs(_context));
|
Assert.That(TestPerDispatchContextAwareHandler.Contexts, Has.All.SameAs(_context));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#region Integration Test Classes
|
#region Integration Test Classes
|
||||||
|
|
||||||
public sealed class TestContextAwareRequestHandler : IRequestHandler<TestContextAwareRequest, string>
|
public sealed class TestContextAwareRequestHandler : IRequestHandler<TestContextAwareRequest, string>
|
||||||
@ -466,10 +464,12 @@ public sealed class TestPerDispatchContextAwareHandler : ContextAwareBase,
|
|||||||
IRequestHandler<TestPerDispatchContextAwareRequest, int>
|
IRequestHandler<TestPerDispatchContextAwareRequest, int>
|
||||||
{
|
{
|
||||||
private static int _nextInstanceId;
|
private static int _nextInstanceId;
|
||||||
|
private static readonly List<IArchitectureContext?> TrackedContexts = [];
|
||||||
|
private static readonly List<int> TrackedInstanceIds = [];
|
||||||
private readonly int _instanceId = Interlocked.Increment(ref _nextInstanceId);
|
private readonly int _instanceId = Interlocked.Increment(ref _nextInstanceId);
|
||||||
|
|
||||||
public static List<IArchitectureContext?> Contexts { get; } = [];
|
public static IReadOnlyList<IArchitectureContext?> Contexts => TrackedContexts;
|
||||||
public static List<int> SeenInstanceIds { get; } = [];
|
public static IReadOnlyList<int> SeenInstanceIds => TrackedInstanceIds;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 记录当前实例编号与收到的架构上下文。
|
/// 记录当前实例编号与收到的架构上下文。
|
||||||
@ -479,8 +479,8 @@ public sealed class TestPerDispatchContextAwareHandler : ContextAwareBase,
|
|||||||
/// <returns>当前处理器实例编号。</returns>
|
/// <returns>当前处理器实例编号。</returns>
|
||||||
public ValueTask<int> Handle(TestPerDispatchContextAwareRequest request, CancellationToken cancellationToken)
|
public ValueTask<int> Handle(TestPerDispatchContextAwareRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Contexts.Add(Context);
|
TrackedContexts.Add(Context);
|
||||||
SeenInstanceIds.Add(_instanceId);
|
TrackedInstanceIds.Add(_instanceId);
|
||||||
return ValueTask.FromResult(_instanceId);
|
return ValueTask.FromResult(_instanceId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -489,8 +489,8 @@ public sealed class TestPerDispatchContextAwareHandler : ContextAwareBase,
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static void Reset()
|
public static void Reset()
|
||||||
{
|
{
|
||||||
Contexts.Clear();
|
TrackedContexts.Clear();
|
||||||
SeenInstanceIds.Clear();
|
TrackedInstanceIds.Clear();
|
||||||
_nextInstanceId = 0;
|
_nextInstanceId = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -573,7 +573,7 @@ public class SharedState
|
|||||||
public sealed record TestConcurrentRequest : IRequest<int>
|
public sealed record TestConcurrentRequest : IRequest<int>
|
||||||
{
|
{
|
||||||
public int RequestId { get; init; }
|
public int RequestId { get; init; }
|
||||||
public List<int> OrderTracker { get; init; } = new();
|
public ICollection<int> OrderTracker { get; init; } = new List<int>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed record TestStateModificationRequest : IRequest<string>
|
public sealed record TestStateModificationRequest : IRequest<string>
|
||||||
@ -615,3 +615,4 @@ public class TestTraditionalCommand : ICommand
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user