diff --git a/packages/flutter_test/lib/src/binding.dart b/packages/flutter_test/lib/src/binding.dart index bd7fa846c0d..3e76c6c8f96 100644 --- a/packages/flutter_test/lib/src/binding.dart +++ b/packages/flutter_test/lib/src/binding.dart @@ -104,10 +104,10 @@ class TestDefaultBinaryMessenger extends BinaryMessenger { Future? send(String channel, ByteData? message) { final Future? resultFuture = delegate.send(channel, message); if (resultFuture != null) { - // Removes the future itself from the [_pendingMessages] list when it - // completes. _pendingMessages.add(resultFuture); - resultFuture.whenComplete(() => _pendingMessages.remove(resultFuture)); + resultFuture + .catchError((Object error) { /* errors are the responsibility of the caller */ }) + .whenComplete(() => _pendingMessages.remove(resultFuture)); } return resultFuture; } diff --git a/packages/flutter_test/test/test_default_binary_messenger_test.dart b/packages/flutter_test/test/test_default_binary_messenger_test.dart new file mode 100644 index 00000000000..bca1bb965a5 --- /dev/null +++ b/packages/flutter_test/test/test_default_binary_messenger_test.dart @@ -0,0 +1,45 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:typed_data'; +import 'dart:ui' as ui; + +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; + +class TestDelegate extends BinaryMessenger { + @override + Future? send(String channel, ByteData? message) async { + expect(channel, ''); + expect(message, isNull); + throw 'Vic Fontaine'; + } + + // Rest of the API isn't needed for this test. + @override + Future handlePlatformMessage(String channel, ByteData? data, ui.PlatformMessageResponseCallback? callback) => throw UnimplementedError(); + @override + void setMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError(); + @override + bool checkMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError(); + @override + void setMockMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError(); + @override + bool checkMockMessageHandler(String channel, MessageHandler? handler) => throw UnimplementedError(); +} + +void main() { + testWidgets('Caught exceptions are caught by the test framework', (WidgetTester tester) async { + final BinaryMessenger delegate = TestDelegate(); + final Future? future = delegate.send('', null); + expect(future, isNotNull); + await future!.catchError((Object error) { }); + try { + await TestDefaultBinaryMessenger(delegate).send('', null); + expect(true, isFalse); // should not reach here + } catch (error) { + expect(error, 'Vic Fontaine'); + } + }); +}