[英]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 ,您可以:
pubspec.yaml
文件中的dev_dependencies
部分。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。
MockUrlLauncher setupMockUrlLauncher() {
final mock = MockUrlLauncher();
registerFallbackValue(const LaunchOptions());
when(() => mock.launchUrl(any(), any())).thenAnswer((_) async => true);
return mock;
}
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.