带本地化的 Flutter 单元测试

问题描述 投票:0回答:1

我有一个实用程序类,它依赖于上下文来翻译输出。 类似于:

static String doSomeLogicAndTranslate(String firstArg, BuildContext context) {
    //...
    return AppLocalizations.of(context)!.someKey;
}

现在,我希望能够为此类编写一些单元测试,但由于第二个参数是上下文,所以我很难这样做。

到目前为止我尝试过的:

  • 使用 Mockito 模拟 BuildContext(如此处所述)并将其作为第二个参数传递 --> 不起作用,因为在 localizations.dart 文件中它会在此处返回 null

      static T? of<T>(BuildContext context, Type type) {
          final _LocalizationsScope? scope = context.dependOnInheritedWidgetOfExactType<_LocalizationsScope>();  /// Scope is null here
          return scope?.localizationsState.resourcesFor<T?>(type);
      }
    

我曾尝试寻找任何其他解决方案,但没有找到任何实质性的解决方案。这看起来应该很简单,但事实并非如此。

flutter dart unit-testing flutter-localizations
1个回答
0
投票

我的第一个建议是通过将

BuildContext
直接传递给您的函数来完全消除对
AppLocalizations
的依赖:

static String doSomeLogicAndTranslate(String firstArg, AppLocalizations loc) {
    //...
    return loc.someKey;
}

如果由于某种原因这是不可能的,您可以使用

testWidgets
设置一个最小的小部件树,并从那里检索用于其余测试的有效构建上下文:

testWidgets('AppLocalizations test', (tester) async {
  await tester.pumpWidget(
    Localizations(
      locale: const Locale('en'), // Or whichever locale you prefer to test with
      delegates: AppLocalizations.localizationsDelegates,
      child: Container(),
    ),
  );
  final BuildContext context = tester.element(find.byType(Container));
  final output = doSomeLogicAndTranslate('some arg', context);
  // Calls to expect or whatever here
});
© www.soinside.com 2019 - 2024. All rights reserved.