Skip to content
Merged
39 changes: 22 additions & 17 deletions GFramework.Cqrs.Tests/Mediator/MediatorAdvancedFeaturesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task Request_With_Validation_Behavior_Should_Validate_Input()
var request = new TestValidatedRequest { Value = -1 }; // 无效值

Assert.ThrowsAsync<ArgumentException>(async () =>
await _context!.SendRequestAsync(request));
await _context!.SendRequestAsync(request).ConfigureAwait(false));
}

[Test]
Expand All @@ -62,7 +62,7 @@ public async Task Request_With_Retry_Behavior_Should_Retry_On_Failure()
TestRetryBehavior.AttemptCount = 0;
var request = new TestRetryRequest { ShouldFailTimes = 0 }; // 不失败

var result = await _context!.SendRequestAsync(request);
var result = await _context!.SendRequestAsync(request).ConfigureAwait(false);

Assert.That(result, Is.EqualTo("Success"));
Assert.That(TestRetryBehavior.AttemptCount, Is.EqualTo(1));
Expand All @@ -82,7 +82,7 @@ public async Task High_Concurrency_Mediator_Requests_Should_Handle_Efficiently()
tasks.Add(_context!.SendRequestAsync(request).AsTask());
}

var results = await Task.WhenAll(tasks);
var results = await Task.WhenAll(tasks).ConfigureAwait(false);
stopwatch.Stop();

// 验证所有请求都成功处理
Expand All @@ -102,7 +102,7 @@ public async Task Memory_Usage_Should_Remain_Stable_Under_Heavy_Load()
for (int i = 0; i < requestCount; i++)
{
var request = new TestMemoryRequest { Data = new string('x', 1000) };
await _context!.SendRequestAsync(request);
await _context!.SendRequestAsync(request).ConfigureAwait(false);

// 定期强制GC来测试内存泄漏
if (i % 100 == 0)
Expand All @@ -126,7 +126,7 @@ public async Task Transient_Error_Should_Be_Handled_By_Retry_Mechanism()
TestTransientErrorHandler.ErrorCount = 0;
var request = new TestTransientErrorRequest { MaxErrors = 0 }; // 不出错

var result = await _context!.SendRequestAsync(request);
var result = await _context!.SendRequestAsync(request).ConfigureAwait(false);

Assert.That(result, Is.EqualTo("Success"));
Assert.That(TestTransientErrorHandler.ErrorCount, Is.EqualTo(0));
Expand All @@ -140,7 +140,8 @@ public async Task Circuit_Breaker_Should_Prevent_Cascading_Failures()
{
try
{
await _context!.SendRequestAsync(new TestCircuitBreakerRequest { ShouldFail = true });
await _context!.SendRequestAsync(new TestCircuitBreakerRequest { ShouldFail = true })
.ConfigureAwait(false);
}
catch (Exception)
{
Expand All @@ -151,7 +152,8 @@ public async Task Circuit_Breaker_Should_Prevent_Cascading_Failures()
// 验证断路器已打开,后续请求应该快速失败
var stopwatch = Stopwatch.StartNew();
Assert.ThrowsAsync<InvalidOperationException>(async () =>
await _context!.SendRequestAsync(new TestCircuitBreakerRequest { ShouldFail = false }));
await _context!.SendRequestAsync(new TestCircuitBreakerRequest { ShouldFail = false })
.ConfigureAwait(false));
stopwatch.Stop();

// 验证快速失败(应该在很短时间内完成)
Expand All @@ -172,7 +174,7 @@ public async Task Saga_Pattern_With_Multiple_Requests_Should_Maintain_Consistenc
// 执行saga
foreach (var request in requests)
{
await _context!.SendRequestAsync(request);
await _context!.SendRequestAsync(request).ConfigureAwait(false);
}

// 验证所有步骤都成功执行
Expand All @@ -192,10 +194,10 @@ public async Task Saga_With_Failure_Should_Rollback_Correctly()
};

// 执行saga,第二步会失败
await _context!.SendRequestAsync(requests[0]);
await _context!.SendRequestAsync(requests[0]).ConfigureAwait(false);

Assert.ThrowsAsync<InvalidOperationException>(async () =>
await _context.SendRequestAsync(requests[1]));
await _context.SendRequestAsync(requests[1]).ConfigureAwait(false));

// 验证回滚机制被触发
Assert.That(sagaData.CompletedSteps, Is.EqualTo(new[] { 1 })); // 只有第一步完成
Expand All @@ -206,7 +208,7 @@ public async Task Saga_With_Failure_Should_Rollback_Correctly()
[Test]
public async Task Request_Chaining_With_Dependencies_Should_Work_Correctly()
{
var chainResult = await _context!.SendRequestAsync(new TestChainStartRequest());
var chainResult = await _context!.SendRequestAsync(new TestChainStartRequest()).ConfigureAwait(false);

Assert.That(chainResult, Is.EqualTo("Chain completed: Step1 -> Step2 -> Step3"));
}
Expand All @@ -218,7 +220,7 @@ public async Task Mediator_With_External_Service_Dependency_Should_Handle_Timeou
var request = new TestExternalServiceRequest { TimeoutMs = 1000 };

Assert.ThrowsAsync<TaskCanceledException>(async () =>
await _context!.SendRequestAsync(request, cts.Token));
await _context!.SendRequestAsync(request, cts.Token).ConfigureAwait(false));
}

[Test]
Expand All @@ -227,13 +229,15 @@ public async Task Mediator_With_Database_Operations_Should_Handle_Transactions()
var testData = new List<string>();
var request = new TestDatabaseRequest { Data = "test data", Storage = testData };

var result = await _context!.SendRequestAsync(request);
var result = await _context!.SendRequestAsync(request).ConfigureAwait(false);

Assert.That(result, Is.EqualTo("Data saved successfully"));
Assert.That(testData, Contains.Item("test data"));
}
}

// 这些高级特性测试需要把一组仅供当前文件使用的辅助类型共置,避免拆成多个噪声文件。
#pragma warning disable MA0048
#region Advanced Test Classes

public sealed class TestRetryRequestHandler : IRequestHandler<TestRetryRequest, string>
Expand Down Expand Up @@ -329,7 +333,7 @@ public sealed class TestChainStartRequestHandler : IRequestHandler<TestChainStar
public async ValueTask<string> Handle(TestChainStartRequest request, CancellationToken cancellationToken)
{
// 模拟链式调用
await Task.Delay(10, cancellationToken);
await Task.Delay(10, cancellationToken).ConfigureAwait(false);
return "Chain completed: Step1 -> Step2 -> Step3";
}
}
Expand All @@ -338,7 +342,7 @@ public sealed class TestExternalServiceRequestHandler : IRequestHandler<TestExte
{
public async ValueTask<string> Handle(TestExternalServiceRequest request, CancellationToken cancellationToken)
{
await Task.Delay(request.TimeoutMs, cancellationToken);
await Task.Delay(request.TimeoutMs, cancellationToken).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested();
return "External service response";
}
Expand Down Expand Up @@ -378,7 +382,7 @@ public ValueTask<string> Handle(TestValidatedRequest request, CancellationToken
// 验证输入
if (request.Value < 0)
{
throw new ArgumentException("Value must be non-negative", nameof(request.Value));
throw new ArgumentException("Value must be non-negative", nameof(request));
}

return new ValueTask<string>($"Value: {request.Value}");
Expand Down Expand Up @@ -406,7 +410,7 @@ public sealed class TestPerformanceRequestHandler : IRequestHandler<TestPerforma
{
public async ValueTask<int> Handle(TestPerformanceRequest request, CancellationToken cancellationToken)
{
await Task.Delay(request.ProcessingTimeMs, cancellationToken);
await Task.Delay(request.ProcessingTimeMs, cancellationToken).ConfigureAwait(false);
return request.Id;
}
}
Expand Down Expand Up @@ -503,3 +507,4 @@ public sealed record TestDatabaseRequest : IRequest<string>
}

#endregion
#pragma warning restore MA0048
Loading
Loading