test(cqrs): 减少 Mediator 综合测试告警

- 优化测试 helper 类型作用域以消除文件名匹配告警

- 补充异步等待 ConfigureAwait(false) 以满足 analyzer 约束

- 调整集合抽象、字符串比较器和异常参数名用法
This commit is contained in:
gewuyou 2026-04-29 08:19:16 +08:00
parent 121df440c3
commit 9109eecea9

View File

@ -86,7 +86,7 @@ public class MediatorComprehensiveTests
public async Task SendRequestAsync_Should_ReturnResult_When_Request_IsValid() public async Task SendRequestAsync_Should_ReturnResult_When_Request_IsValid()
{ {
var testRequest = new TestRequest { Value = 42 }; var testRequest = new TestRequest { Value = 42 };
var result = await _context!.SendRequestAsync(testRequest); var result = await _context!.SendRequestAsync(testRequest).ConfigureAwait(false);
Assert.That(result, Is.EqualTo(42)); Assert.That(result, Is.EqualTo(42));
} }
@ -98,7 +98,7 @@ public class MediatorComprehensiveTests
public void SendRequestAsync_Should_ThrowArgumentNullException_When_Request_IsNull() public void SendRequestAsync_Should_ThrowArgumentNullException_When_Request_IsNull()
{ {
Assert.ThrowsAsync<ArgumentNullException>(async () => Assert.ThrowsAsync<ArgumentNullException>(async () =>
await _context!.SendRequestAsync<int>(null!)); await _context!.SendRequestAsync<int>(null!).ConfigureAwait(false));
} }
/// <summary> /// <summary>
@ -122,8 +122,8 @@ public class MediatorComprehensiveTests
TestNotificationHandler.LastReceivedMessage = null; TestNotificationHandler.LastReceivedMessage = null;
var notification = new TestNotification { Message = "test" }; var notification = new TestNotification { Message = "test" };
await _context!.PublishAsync(notification); await _context!.PublishAsync(notification).ConfigureAwait(false);
await Task.Delay(100); await Task.Delay(100).ConfigureAwait(false);
Assert.That(TestNotificationHandler.LastReceivedMessage, Is.EqualTo("test")); Assert.That(TestNotificationHandler.LastReceivedMessage, Is.EqualTo("test"));
} }
@ -138,7 +138,7 @@ public class MediatorComprehensiveTests
var stream = _context!.CreateStream(testStreamRequest); var stream = _context!.CreateStream(testStreamRequest);
var results = new List<int>(); var results = new List<int>();
await foreach (var item in stream) await foreach (var item in stream.ConfigureAwait(false))
{ {
results.Add(item); results.Add(item);
} }
@ -153,7 +153,7 @@ public class MediatorComprehensiveTests
public async Task SendAsync_CommandWithoutResult_Should_Execute_When_Command_IsValid() public async Task SendAsync_CommandWithoutResult_Should_Execute_When_Command_IsValid()
{ {
var testCommand = new TestCommand { ShouldExecute = true }; var testCommand = new TestCommand { ShouldExecute = true };
await _context!.SendAsync(testCommand); await _context!.SendAsync(testCommand).ConfigureAwait(false);
Assert.That(testCommand.Executed, Is.True); Assert.That(testCommand.Executed, Is.True);
} }
@ -165,7 +165,7 @@ public class MediatorComprehensiveTests
public async Task SendAsync_CommandWithResult_Should_ReturnResult_When_Command_IsValid() public async Task SendAsync_CommandWithResult_Should_ReturnResult_When_Command_IsValid()
{ {
var testCommand = new TestCommandWithResult { ResultValue = 42 }; var testCommand = new TestCommandWithResult { ResultValue = 42 };
var result = await _context!.SendAsync(testCommand); var result = await _context!.SendAsync(testCommand).ConfigureAwait(false);
Assert.That(result, Is.EqualTo(42)); Assert.That(result, Is.EqualTo(42));
} }
@ -198,7 +198,7 @@ public class MediatorComprehensiveTests
var testRequest = new TestRequest { Value = 42 }; var testRequest = new TestRequest { Value = 42 };
Assert.ThrowsAsync<InvalidOperationException>(async () => Assert.ThrowsAsync<InvalidOperationException>(async () =>
await contextWithoutHandlers.SendRequestAsync(testRequest)); await contextWithoutHandlers.SendRequestAsync(testRequest).ConfigureAwait(false));
} }
/// <summary> /// <summary>
@ -213,8 +213,8 @@ public class MediatorComprehensiveTests
TestNotificationHandler3.LastReceivedMessage = null; TestNotificationHandler3.LastReceivedMessage = null;
var notification = new TestNotification { Message = "multi-handler test" }; var notification = new TestNotification { Message = "multi-handler test" };
await _context!.PublishAsync(notification); await _context!.PublishAsync(notification).ConfigureAwait(false);
await Task.Delay(100); await Task.Delay(100).ConfigureAwait(false);
// 验证所有处理器都被调用 // 验证所有处理器都被调用
Assert.That(TestNotificationHandler.LastReceivedMessage, Is.EqualTo("multi-handler test")); Assert.That(TestNotificationHandler.LastReceivedMessage, Is.EqualTo("multi-handler test"));
@ -233,7 +233,7 @@ public class MediatorComprehensiveTests
// 应该在50ms后被取消 // 应该在50ms后被取消
Assert.ThrowsAsync<TaskCanceledException>(async () => Assert.ThrowsAsync<TaskCanceledException>(async () =>
await _context!.SendRequestAsync(longRequest, cts.Token)); await _context!.SendRequestAsync(longRequest, cts.Token).ConfigureAwait(false));
} }
/// <summary> /// <summary>
@ -251,7 +251,7 @@ public class MediatorComprehensiveTests
// 流应该在100ms后被取消TaskCanceledException 继承自 OperationCanceledException // 流应该在100ms后被取消TaskCanceledException 继承自 OperationCanceledException
Assert.CatchAsync<OperationCanceledException>(async () => Assert.CatchAsync<OperationCanceledException>(async () =>
{ {
await foreach (var item in stream) await foreach (var item in stream.ConfigureAwait(false))
{ {
results.Add(item); results.Add(item);
} }
@ -277,7 +277,7 @@ public class MediatorComprehensiveTests
tasks.Add(_context!.SendRequestAsync(request).AsTask()); tasks.Add(_context!.SendRequestAsync(request).AsTask());
} }
var results = await Task.WhenAll(tasks); var results = await Task.WhenAll(tasks).ConfigureAwait(false);
// 验证所有结果都正确返回 // 验证所有结果都正确返回
Assert.That(results.Length, Is.EqualTo(requestCount)); Assert.That(results.Length, Is.EqualTo(requestCount));
@ -293,7 +293,7 @@ public class MediatorComprehensiveTests
var faultyRequest = new TestFaultyRequest(); var faultyRequest = new TestFaultyRequest();
Assert.ThrowsAsync<InvalidOperationException>(async () => Assert.ThrowsAsync<InvalidOperationException>(async () =>
await _context!.SendRequestAsync(faultyRequest)); await _context!.SendRequestAsync(faultyRequest).ConfigureAwait(false));
} }
/// <summary> /// <summary>
@ -306,8 +306,8 @@ public class MediatorComprehensiveTests
var command1 = new TestModifyDataCommand { Data = sharedData, Value = 10 }; var command1 = new TestModifyDataCommand { Data = sharedData, Value = 10 };
var command2 = new TestModifyDataCommand { Data = sharedData, Value = 20 }; var command2 = new TestModifyDataCommand { Data = sharedData, Value = 20 };
await _context!.SendAsync(command1); await _context!.SendAsync(command1).ConfigureAwait(false);
await _context.SendAsync(command2); await _context.SendAsync(command2).ConfigureAwait(false);
// 验证数据被正确修改 // 验证数据被正确修改
Assert.That(sharedData.Value, Is.EqualTo(30)); // 10 + 20 Assert.That(sharedData.Value, Is.EqualTo(30)); // 10 + 20
@ -331,10 +331,10 @@ public class MediatorComprehensiveTests
foreach (var notification in notifications) foreach (var notification in notifications)
{ {
await _context!.PublishAsync(notification); await _context!.PublishAsync(notification).ConfigureAwait(false);
} }
await Task.Delay(200); // 等待所有处理完成 await Task.Delay(200).ConfigureAwait(false); // 等待所有处理完成
// 验证接收顺序与发送顺序一致 // 验证接收顺序与发送顺序一致
Assert.That(receivedOrder.Count, Is.EqualTo(3)); Assert.That(receivedOrder.Count, Is.EqualTo(3));
@ -358,7 +358,7 @@ public class MediatorComprehensiveTests
var stream = _context!.CreateStream(filterRequest); var stream = _context!.CreateStream(filterRequest);
var results = new List<int>(); var results = new List<int>();
await foreach (var item in stream) await foreach (var item in stream.ConfigureAwait(false))
{ {
results.Add(item); results.Add(item);
} }
@ -377,7 +377,7 @@ public class MediatorComprehensiveTests
var invalidCommand = new TestValidatedCommand { Name = "" }; // 无效:空字符串 var invalidCommand = new TestValidatedCommand { Name = "" }; // 无效:空字符串
Assert.ThrowsAsync<ArgumentException>(async () => Assert.ThrowsAsync<ArgumentException>(async () =>
await _context!.SendAsync(invalidCommand)); await _context!.SendAsync(invalidCommand).ConfigureAwait(false));
} }
/// <summary> /// <summary>
@ -392,7 +392,7 @@ public class MediatorComprehensiveTests
for (int i = 0; i < iterations; i++) for (int i = 0; i < iterations; i++)
{ {
var request = new TestRequest { Value = i }; var request = new TestRequest { Value = 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));
} }
@ -417,15 +417,13 @@ public class MediatorComprehensiveTests
// 使用自有 CQRS 方式 // 使用自有 CQRS 方式
var mediatorCommand = new TestCommandWithResult { ResultValue = 999 }; var mediatorCommand = new TestCommandWithResult { ResultValue = 999 };
var result = await _context.SendAsync(mediatorCommand); var result = await _context.SendAsync(mediatorCommand).ConfigureAwait(false);
Assert.That(result, Is.EqualTo(999)); Assert.That(result, Is.EqualTo(999));
// 验证两者可以同时工作 // 验证两者可以同时工作
Assert.That(legacyCommand.Executed, Is.True); Assert.That(legacyCommand.Executed, Is.True);
Assert.That(result, Is.EqualTo(999)); Assert.That(result, Is.EqualTo(999));
} }
}
#region Advanced Test Classes for CQRS Features #region Advanced Test Classes for CQRS Features
public sealed record TestLongRunningRequest : IRequest<string> public sealed record TestLongRunningRequest : IRequest<string>
@ -437,7 +435,7 @@ public sealed class TestLongRunningRequestHandler : IRequestHandler<TestLongRunn
{ {
public async ValueTask<string> Handle(TestLongRunningRequest request, CancellationToken cancellationToken) public async ValueTask<string> Handle(TestLongRunningRequest request, CancellationToken cancellationToken)
{ {
await Task.Delay(request.DelayMs, cancellationToken); await Task.Delay(request.DelayMs, cancellationToken).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
return "Completed"; return "Completed";
} }
@ -458,7 +456,7 @@ public sealed class TestLongStreamRequestHandler : IStreamRequestHandler<TestLon
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
yield return i; yield return i;
await Task.Delay(10, cancellationToken); // 模拟处理延迟 await Task.Delay(10, cancellationToken).ConfigureAwait(false); // 模拟处理延迟
} }
} }
} }
@ -496,7 +494,7 @@ public sealed class TestModifyDataCommandHandler : IRequestHandler<TestModifyDat
public sealed record TestCachingQuery : IRequest<string> public sealed record TestCachingQuery : IRequest<string>
{ {
public string Key { get; init; } = string.Empty; public string Key { get; init; } = string.Empty;
public Dictionary<string, string> Cache { get; init; } = new(); public IDictionary<string, string> Cache { get; init; } = new Dictionary<string, string>(StringComparer.Ordinal);
} }
public sealed class TestCachingQueryHandler : IRequestHandler<TestCachingQuery, string> public sealed class TestCachingQueryHandler : IRequestHandler<TestCachingQuery, string>
@ -522,7 +520,7 @@ public sealed record TestOrderedNotification : INotification
public sealed class TestOrderedNotificationHandler : INotificationHandler<TestOrderedNotification> public sealed class TestOrderedNotificationHandler : INotificationHandler<TestOrderedNotification>
{ {
public static List<string> ReceivedMessages { get; set; } = new(); public static ICollection<string> ReceivedMessages { get; set; } = new List<string>();
public ValueTask Handle(TestOrderedNotification notification, CancellationToken cancellationToken) public ValueTask Handle(TestOrderedNotification notification, CancellationToken cancellationToken)
{ {
@ -590,7 +588,7 @@ public sealed class TestValidatedCommandHandler : IRequestHandler<TestValidatedC
{ {
if (string.IsNullOrWhiteSpace(request.Name)) if (string.IsNullOrWhiteSpace(request.Name))
{ {
throw new ArgumentException($"Name cannot be empty {nameof(request.Name)}"); throw new ArgumentException("Name cannot be empty.", nameof(request));
} }
return ValueTask.FromResult(Unit.Value); return ValueTask.FromResult(Unit.Value);
@ -719,3 +717,5 @@ public sealed class TestStreamRequestHandler : IStreamRequestHandler<TestStreamR
} }
#endregion #endregion
}