gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:20:40 26 4
gpt4 key购买 nike

在我的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com