如何模拟 url_launcher 包进行颤动测试?

Tal*_*leb 4 testing mocking mockito flutter url-launcher

我在我的 flutter 项目中使用了url_launcher: ^6.1.0 。我开始为我的小部件编写测试,但是使用url_launcher方法启动 URL 的小部件部分在运行测试时无法正常工作。

我在小部件中使用的方法之一如下所示:

 Future<void> _onTapLink(String? href) async {
    if (href == null) return;

    // canLaunchUrl method never return anything when we are calling this function inside flutter test
    if (await canLaunchUrl(Uri.parse(href))) {
      await launchUrl(Uri.parse(href));
    } else {
      print('cannot launch url: $href');
    }
  }
Run Code Online (Sandbox Code Playgroud)

当我们在 flutter 测试中调用此函数时,canLaunchUrl方法永远不会返回任何内容。

我正在寻找一种方法来模拟url_launcher包以使用内部颤动测试。

ole*_*.le 7

要模拟url_launcher你可以:

  1. plugin_platform_interfaceurl_launcher_platform_interface包添加到文件dev_dependencies中的部分pubspec.yaml
  2. 实现模拟类。例如,对于mocktail ,实现将是:
import 'package:mocktail/mocktail.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';

class MockUrlLauncher extends Mock
    with MockPlatformInterfaceMixin
    implements UrlLauncherPlatform {}
Run Code Online (Sandbox Code Playgroud)

注意这里MockPlatformInterfaceMixin使用了mixin。

  1. 像往常一样配置模拟。对于无酒精鸡尾酒,可能是:
MockUrlLauncher setupMockUrlLauncher() {
  final mock = MockUrlLauncher();
  registerFallbackValue(const LaunchOptions());

  when(() => mock.launchUrl(any(), any())).thenAnswer((_) async => true);
  return mock;
}
Run Code Online (Sandbox Code Playgroud)
  1. url_launcher通过设置来告诉使用模拟版本UrlLauncherPlatform.instance
final mock = setupMockUrlLauncher();
UrlLauncherPlatform.instance = mock;
Run Code Online (Sandbox Code Playgroud)