我有一个实用程序类,它依赖于上下文来翻译输出。 类似于:
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);
}
我曾尝试寻找任何其他解决方案,但没有找到任何实质性的解决方案。这看起来应该很简单,但事实并非如此。
我的第一个建议是通过将
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
});