Flutter 如何模拟对 rootBundle.loadString(...) 的调用,然后重置模拟的行为?

标签 flutter dart flutter-test

在我的 flutter 代码中,我有这样做的逻辑:

final jsonString = await rootBundle.loadString('AssetManifest.json');

我有测试想返回一个假 AssetManifest.json当到达这条线时。

为了模拟它,我在测试中这样做:
ServicesBinding.instance.defaultBinaryMessenger
    .setMockMessageHandler('flutter/assets', (message) {
  final Uint8List encoded =
      utf8.encoder.convert('{"Foo.ttf":["Foo.ttf"]}');
  return Future.value(encoded.buffer.asByteData());
});

奇怪的是,这行得通,但是在它挂起之后运行的任何测试都会挂起(当它到达 await rootBundle.loadString('AssetManifest.json') 行时,它们都会卡在代码中。

我试过添加
ServicesBinding.instance.defaultBinaryMessenger
    .setMockMessageHandler('flutter/assets', null);

但这似乎并没有正确“清理”被 mock 的行为。事实上,如果我在 setUp 中运行上述行,运行的第一个测试挂起。

所以我 mock 这种行为是错误的吗?还是我没有正确清理它?

最佳答案

我遇到了同样的问题,并认为这是由于捆绑包缓存造成的。这将导致上述测试失败,因为消息永远不会被发送。调用loadString时,可以指定是否缓存结果。例如。 loadString('AssetManifest.json', false) .

请注意,如果您使用 loadStructuredData ,实现可以缓存结果,你不能告诉它不要。

关于Flutter 如何模拟对 rootBundle.loadString(...) 的调用,然后重置模拟的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60079645/

相关文章:

flutter - Flutter 应用程序构建上的任务 ':sms:verifyReleaseResources' 和线程 "main"中的异常 java.lang.NullPointerException 执行失败

generics - 如何确保泛型中的类型实现 Dart 中的某些运算符?

flutter - Riverpod - 如何在测试中访问提供者?

flutter 包 : Uncompressed package archive is too large

ios - Flutter 推送通知 : Unable to receive notifications in background or when app is closed

Flutter 滚动条在 Windows 桌面上不可拖动

flutter - 有没有一种简单的方法可以在 Flutter 测试中找到从 RichText 构建的特定文本?

dart - 找到小部件后,我能否获取它的文本或其他属性?

firebase - 如何在flutter中获取Firestore文档的数量

android-studio - 如何解决 flutter 中的版本控制