diff --git a/packages/flutter_tools/lib/src/commands/test.dart b/packages/flutter_tools/lib/src/commands/test.dart index 92bc4c1e3d4..a243c063aba 100644 --- a/packages/flutter_tools/lib/src/commands/test.dart +++ b/packages/flutter_tools/lib/src/commands/test.dart @@ -715,7 +715,7 @@ class TestCommand extends FlutterCommand with DeviceBasedDevelopmentArtifacts { testTimeRecorder?.print(); if (result != 0) { - throwToolExit(null); + throwToolExit(null, exitCode: result); } return FlutterCommandResult.success(); } diff --git a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart index 95c8d974a36..eada63e9e03 100644 --- a/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart +++ b/packages/flutter_tools/test/commands.shard/hermetic/test_test.dart @@ -1629,6 +1629,25 @@ resolution: workspace Logger: () => logger, }, ); + + testUsingContext( + 'The dart test exit code should be forwarded', + () async { + final FakeFlutterTestRunner testRunner = FakeFlutterTestRunner(79); + + final TestCommand testCommand = TestCommand(testRunner: testRunner); + final CommandRunner commandRunner = createTestCommandRunner(testCommand); + + expect( + () => commandRunner.run(const ['test', '--no-pub']), + throwsToolExit(exitCode: 79), + ); + }, + overrides: { + FileSystem: () => fs, + ProcessManager: () => FakeProcessManager.any(), + }, + ); } class FakeFlutterTestRunner implements FlutterTestRunner {