簡體   English   中英

如何為 flutter 測試模擬 url_launcher package?

[英]How to mock url_launcher package for flutter test?

我在我的 flutter 項目中使用了 url_launcher: ^6.1.0 我開始為我的小部件編寫測試,但是使用url_launcher方法啟動 URL 的小部件部分在運行測試時無法正常工作。

我在 Widget 中使用的方法之一如下所示:

 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');
    }
  }

當我們在 flutter 測試中調用這個 function 時, canLaunchUrl方法從不返回任何東西。

我正在尋找一種方法來模擬url_launcher package 以在 flutter 測試中使用。

要模擬url_launcher ,您可以:

  1. plugin_platform_interfaceurl_launcher_platform_interface包添加到pubspec.yaml文件中的dev_dependencies部分。
  2. 實施模擬 class。例如,使用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 {}

請注意,這里使用了MockPlatformInterfaceMixin mixin。

  1. 像往常一樣配置模擬。 無酒精雞尾酒可能是:
MockUrlLauncher setupMockUrlLauncher() {
  final mock = MockUrlLauncher();
  registerFallbackValue(const LaunchOptions());

  when(() => mock.launchUrl(any(), any())).thenAnswer((_) async => true);
  return mock;
}
  1. 通過在UrlLauncherPlatform.instance中設置告訴url_launcher使用模擬版本:
final mock = setupMockUrlLauncher();
UrlLauncherPlatform.instance = mock;

這是一篇明確解釋如何模擬或偽造launchUrl function 的文章。這是一個如何使用mocktail模擬它的示例。 它還使用ioc_container package 來處理依賴注入的替換。

import 'package:fafsdfsdf/main.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:flutter/material.dart';

class LaunchMock extends Mock {
  Future<bool> call(
    Uri url, {
    LaunchMode? mode,
    WebViewConfiguration? webViewConfiguration,
    String? webOnlyWindowName,
  });
}

void main() {
  testWidgets('Test Url Launch', (tester) async {
    //These allow default values
    registerFallbackValue(LaunchMode.platformDefault);
    registerFallbackValue(const WebViewConfiguration());

    //Create the mock
    final mock = LaunchMock();
    when(() => mock(
          flutterDevUri,
          mode: any(named: 'mode'),
          webViewConfiguration: any(named: 'webViewConfiguration'),
          webOnlyWindowName: any(named: 'webOnlyWindowName'),
        )).thenAnswer((_) async => true);

    final builder = compose()
      //Replace the launch function with a mock
      ..addSingletonService<LaunchUrl>(mock);

    await tester.pumpWidget(
      builder.toContainer()<MyApp>(),
    );

    //Tap the icon
    await tester.tap(
      find.byIcon(Icons.favorite),
    );

    await tester.pumpAndSettle();

    verify(() => mock(flutterDevUri)).called(1);
  });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM