如何在 Flutter 中测试使用 package_info 的方法?

Tim*_*rsy 9 unit-testing dart package-info flutter

我正在编写一个 Flutter 插件,用于检查 Play Store 或 App Store 以查看应用程序是否需要更新。我正在使用该package_info包来确定用户拥有的应用程序版本。我的代码如下所示:

getVersionStatus() {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    localVersion = packageInfo.version;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想测试这个方法,但如果它作为单元测试运行它,fromPlatform调用就会挂起并超时测试。有没有比传testing入布尔值更优雅的方法来解决这个问题?IE:

if (testing) {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    localVersion = packageInfo.version;
} else {
    localVersion = '0.0.0'
}
Run Code Online (Sandbox Code Playgroud)

package_info包是否应该提供一种捕获错误的方法?有没有办法判断该方法是否正在由测试运行?

sil*_*ric 11

就像 Günter 所说的,您可以通过在插件的 MethodChannel 中安装模拟方法处理程序来模拟PackageInfo

void packageInfoMock() {
  const MethodChannel('plugins.flutter.io/package_info').setMockMethodCallHandler((MethodCall methodCall) async {
    if (methodCall.method == 'getAll') {
      return <String, dynamic>{
        'appName': 'ABC',  // <--- set initial values here
        'packageName': 'A.B.C',  // <--- set initial values here
        'version': '1.0.0',  // <--- set initial values here
        'buildNumber': ''  // <--- set initial values here
      };
    }
    return null;
  });
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记导入 'package:flutter/services.dart'; (2认同)

Moh*_*haf 7

PackageInfo.setMockInitialValues(appName: "abc", packageName: "com.example.example", version: "1.0", buildNumber: "2", buildSignature: "buildSignature");
Run Code Online (Sandbox Code Playgroud)

  • 请参阅“[解释完全基于代码的答案](https://meta.stackoverflow.com/q/392712/128421)”。虽然这在技术上可能是正确的,但它并不能解释为什么它可以解决问题或应该成为选定的答案。我们应该在帮助解决问题的同时进行教育。 (4认同)