From 210715d0cd8266ff41cb1078470066315a1c022e Mon Sep 17 00:00:00 2001 From: "JSD\\13999" <1399945104@qq.com> Date: Mon, 18 May 2026 14:56:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B5=8B=E8=AF=95=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E9=9B=86=E7=BC=96=E8=AF=91=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Config/JsonConfigProviderTests.cs | 28 +++++++++++++++---- .../Tests/EditMode/Flow/GameFlowTests.cs | 28 +++++++++++++++---- .../EditMode/FlowScope.Tests.EditMode.asmdef | 7 +++-- .../Tests/EditMode/Save/SaveServiceTests.cs | 24 +++++++++++++--- .../PlayMode/FlowScope.Tests.PlayMode.asmdef | 7 +++-- .../AddressablesResourceServiceTests.cs | 20 +++++++++++-- .../Tests/PlayMode/UI/UIManagerTests.cs | 18 +++++++++++- 7 files changed, 109 insertions(+), 23 deletions(-) diff --git a/My project/Assets/FlowScope/Tests/EditMode/Config/JsonConfigProviderTests.cs b/My project/Assets/FlowScope/Tests/EditMode/Config/JsonConfigProviderTests.cs index 58e4b9b..362d189 100644 --- a/My project/Assets/FlowScope/Tests/EditMode/Config/JsonConfigProviderTests.cs +++ b/My project/Assets/FlowScope/Tests/EditMode/Config/JsonConfigProviderTests.cs @@ -45,35 +45,35 @@ namespace FlowScope.Tests.EditMode.Config } [Test] - public void LoadAllAsync_DuplicateId_ThrowsWithId() + public async Task LoadAllAsync_DuplicateId_ThrowsWithId() { var provider = new JsonConfigProvider(new[] { JsonConfigProvider.Mapping("weapons.json", _ => Task.FromResult("[{\"id\":101,\"name\":\"Axe\"},{\"id\":101,\"name\":\"Sword\"}]")) }); - var exception = Assert.ThrowsAsync( + var exception = await ThrowsAsync( async () => await provider.LoadAllAsync(CancellationToken.None)); Assert.That(exception.Message, Does.Contain("101")); } [Test] - public void LoadAllAsync_MalformedJson_ThrowsWithFileName() + public async Task LoadAllAsync_MalformedJson_ThrowsWithFileName() { var provider = new JsonConfigProvider(new[] { JsonConfigProvider.Mapping("weapons.json", _ => Task.FromResult("[{\"id\":101")) }); - var exception = Assert.ThrowsAsync( + var exception = await ThrowsAsync( async () => await provider.LoadAllAsync(CancellationToken.None)); Assert.That(exception.Message, Does.Contain("weapons.json")); } [Test] - public void LoadAllAsync_CanceledToken_ThrowsOperationCanceledException() + public async Task LoadAllAsync_CanceledToken_ThrowsOperationCanceledException() { using var cts = new CancellationTokenSource(); cts.Cancel(); @@ -82,10 +82,26 @@ namespace FlowScope.Tests.EditMode.Config JsonConfigProvider.Mapping("weapons.json", _ => Task.FromResult("[]")) }); - Assert.ThrowsAsync( + await ThrowsAsync( async () => await provider.LoadAllAsync(cts.Token)); } + private static async Task ThrowsAsync(Func action) + where TException : Exception + { + try + { + await action(); + } + catch (TException exception) + { + return exception; + } + + Assert.Fail($"Expected {typeof(TException).Name}."); + return null; + } + private sealed class WeaponConfig : IConfigRow { public int id; diff --git a/My project/Assets/FlowScope/Tests/EditMode/Flow/GameFlowTests.cs b/My project/Assets/FlowScope/Tests/EditMode/Flow/GameFlowTests.cs index ce84f8a..474c0ab 100644 --- a/My project/Assets/FlowScope/Tests/EditMode/Flow/GameFlowTests.cs +++ b/My project/Assets/FlowScope/Tests/EditMode/Flow/GameFlowTests.cs @@ -59,13 +59,13 @@ namespace FlowScope.Tests.EditMode.Flow } [Test] - public void StartupAsync_WhenFeatureLoadFails_CleansCreatedFeatureAndReturnsIdle() + public async Task StartupAsync_WhenFeatureLoadFails_CleansCreatedFeatureAndReturnsIdle() { var services = new TestServices(); var root = services.CreateRoot(); var flow = new GameFlow(); - Assert.ThrowsAsync( + await ThrowsAsync( async () => await flow.StartupAsync(root, CancellationToken.None)); Assert.That(flow.State, Is.EqualTo(GameFlowState.Idle)); @@ -81,7 +81,7 @@ namespace FlowScope.Tests.EditMode.Flow var flow = new GameFlow(); await flow.StartupAsync(root, CancellationToken.None); - Assert.ThrowsAsync( + await ThrowsAsync( async () => await flow.SwitchToAsync(CancellationToken.None)); Assert.That(flow.State, Is.EqualTo(GameFlowState.NoActiveFeature)); @@ -91,11 +91,11 @@ namespace FlowScope.Tests.EditMode.Flow } [Test] - public void SwitchToAsync_WhenIdle_ThrowsWithOperationAndCurrentState() + public async Task SwitchToAsync_WhenIdle_ThrowsWithOperationAndCurrentState() { var flow = new GameFlow(); - var exception = Assert.ThrowsAsync( + var exception = await ThrowsAsync( async () => await flow.SwitchToAsync(CancellationToken.None)); Assert.That(exception.Message, Does.Contain(nameof(GameFlow.SwitchToAsync))); @@ -126,7 +126,7 @@ namespace FlowScope.Tests.EditMode.Flow using var cts = new CancellationTokenSource(); cts.Cancel(); - Assert.ThrowsAsync( + await ThrowsAsync( async () => await flow.ShutdownAsync(cts.Token)); Assert.That(flow.State, Is.EqualTo(GameFlowState.Disposed)); @@ -134,6 +134,22 @@ namespace FlowScope.Tests.EditMode.Flow Assert.That(services.Resource.Groups[0].IsDisposed, Is.True); } + private static async Task ThrowsAsync(Func action) + where TException : Exception + { + try + { + await action(); + } + catch (TException exception) + { + return exception; + } + + Assert.Fail($"Expected {typeof(TException).Name}."); + return null; + } + private sealed class TestServices { public TestConfigProvider Config { get; } = new(); diff --git a/My project/Assets/FlowScope/Tests/EditMode/FlowScope.Tests.EditMode.asmdef b/My project/Assets/FlowScope/Tests/EditMode/FlowScope.Tests.EditMode.asmdef index 28780eb..bf12bf7 100644 --- a/My project/Assets/FlowScope/Tests/EditMode/FlowScope.Tests.EditMode.asmdef +++ b/My project/Assets/FlowScope/Tests/EditMode/FlowScope.Tests.EditMode.asmdef @@ -10,8 +10,11 @@ ], "excludePlatforms": [], "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], + "overrideReferences": true, + "precompiledReferences": [ + "R3.dll", + "nunit.framework.dll" + ], "autoReferenced": false, "defineConstraints": [], "versionDefines": [], diff --git a/My project/Assets/FlowScope/Tests/EditMode/Save/SaveServiceTests.cs b/My project/Assets/FlowScope/Tests/EditMode/Save/SaveServiceTests.cs index 433171d..ead2b8c 100644 --- a/My project/Assets/FlowScope/Tests/EditMode/Save/SaveServiceTests.cs +++ b/My project/Assets/FlowScope/Tests/EditMode/Save/SaveServiceTests.cs @@ -61,27 +61,43 @@ namespace FlowScope.Tests.EditMode.Save } [Test] - public void SaveAsync_WriteFailure_ThrowsWithKey() + public async Task SaveAsync_WriteFailure_ThrowsWithKey() { var service = new SaveService(new FailingWriteStorage(), new JsonSaveSerializer()); - var exception = Assert.ThrowsAsync( + var exception = await ThrowsAsync( async () => await service.SaveAsync("player", new PlayerData(), CancellationToken.None)); Assert.That(exception.Message, Does.Contain("player")); } [Test] - public void SaveAsync_CanceledToken_ThrowsOperationCanceledException() + public async Task SaveAsync_CanceledToken_ThrowsOperationCanceledException() { using var cts = new CancellationTokenSource(); cts.Cancel(); var service = new SaveService(new MemorySaveStorage(), new JsonSaveSerializer()); - Assert.ThrowsAsync( + await ThrowsAsync( async () => await service.SaveAsync("player", new PlayerData(), cts.Token)); } + private static async Task ThrowsAsync(Func action) + where TException : Exception + { + try + { + await action(); + } + catch (TException exception) + { + return exception; + } + + Assert.Fail($"Expected {typeof(TException).Name}."); + return null; + } + private sealed class PlayerData { public ReactiveProperty Gold { get; } = new(0); diff --git a/My project/Assets/FlowScope/Tests/PlayMode/FlowScope.Tests.PlayMode.asmdef b/My project/Assets/FlowScope/Tests/PlayMode/FlowScope.Tests.PlayMode.asmdef index abba59e..0da6381 100644 --- a/My project/Assets/FlowScope/Tests/PlayMode/FlowScope.Tests.PlayMode.asmdef +++ b/My project/Assets/FlowScope/Tests/PlayMode/FlowScope.Tests.PlayMode.asmdef @@ -9,8 +9,11 @@ "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, - "overrideReferences": false, - "precompiledReferences": [], + "overrideReferences": true, + "precompiledReferences": [ + "R3.dll", + "nunit.framework.dll" + ], "autoReferenced": false, "defineConstraints": [], "versionDefines": [], diff --git a/My project/Assets/FlowScope/Tests/PlayMode/Resources/AddressablesResourceServiceTests.cs b/My project/Assets/FlowScope/Tests/PlayMode/Resources/AddressablesResourceServiceTests.cs index e739bba..a3a7c78 100644 --- a/My project/Assets/FlowScope/Tests/PlayMode/Resources/AddressablesResourceServiceTests.cs +++ b/My project/Assets/FlowScope/Tests/PlayMode/Resources/AddressablesResourceServiceTests.cs @@ -39,19 +39,35 @@ namespace FlowScope.Tests.PlayMode.Resources } [Test] - public void LoadAsync_WhenBackendFails_IncludesKeyAndBackend() + public async Task LoadAsync_WhenBackendFails_IncludesKeyAndBackend() { var service = new AddressablesResourceService( (_, _, _) => throw new InvalidOperationException("missing"), (_, _) => { }); - var exception = Assert.ThrowsAsync( + var exception = await ThrowsAsync( () => service.LoadAsync("missing-key", CancellationToken.None)); StringAssert.Contains("missing-key", exception.Message); StringAssert.Contains("Addressables", exception.Message); } + private static async Task ThrowsAsync(Func action) + where TException : Exception + { + try + { + await action(); + } + catch (TException exception) + { + return exception; + } + + Assert.Fail($"Expected {typeof(TException).Name}."); + return null; + } + private sealed class TestAsset { } diff --git a/My project/Assets/FlowScope/Tests/PlayMode/UI/UIManagerTests.cs b/My project/Assets/FlowScope/Tests/PlayMode/UI/UIManagerTests.cs index a28e0b8..73d9927 100644 --- a/My project/Assets/FlowScope/Tests/PlayMode/UI/UIManagerTests.cs +++ b/My project/Assets/FlowScope/Tests/PlayMode/UI/UIManagerTests.cs @@ -154,7 +154,7 @@ namespace FlowScope.Tests.PlayMode.UI var manager = new UIManager(resources); manager.RegisterLayer("popup", canvas, 0); - Assert.ThrowsAsync( + await ThrowsAsync( () => manager.OpenAsync(new TestViewModel("boom"), CancellationToken.None)); Assert.That(resources.Handles[0].IsDisposed, Is.True); @@ -169,6 +169,22 @@ namespace FlowScope.Tests.PlayMode.UI return gameObject.AddComponent(); } + private static async Task ThrowsAsync(Func action) + where TException : Exception + { + try + { + await action(); + } + catch (TException exception) + { + return exception; + } + + Assert.Fail($"Expected {typeof(TException).Name}."); + return null; + } + private GameObject CreatePrefab(string name) where TPanel : Component {