Tim Traversy
Tim Traversy

Reputation: 482

How to test a method that uses package_info in Flutter?

I am writing a Flutter plugin that checks the Play Store or App Store to see if the app needs to be updated. I'm using the package_info package to determine the version of the app that the user has. My code looks like this:

getVersionStatus() {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    localVersion = packageInfo.version;
    ...
}

I want to test this method, but if it run it as a unit test the fromPlatform call just hangs and times out the test. Is there a more elegant way to solve this than passing in a testing boolean? I.e:

if (testing) {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    localVersion = packageInfo.version;
} else {
    localVersion = '0.0.0'
}

Should the package_info package provide a way to catch errors? Is there a way to tell if the method is being run by a test?

Upvotes: 15

Views: 4758

Answers (4)

Sanjay Bharwani
Sanjay Bharwani

Reputation: 4749

We had below code to populate the version info in App's About section

final packageInfo = await PackageInfo.fromPlatform();
final versionName = packageInfo.version;
final buildNumber = packageInfo.buildNumber;

To support the widget test, below is the code to mock the PackageInfo

PackageInfo.setMockInitialValues(
      appName: 'test',
      packageName: 'com.test.test',
      version: '1',
      buildNumber: '123',
      buildSignature: 'test',
    );

this comes from package_info_plus.dart which provides the implementation of PackageIngo, and the method setMockInitialValues is added to support the testing.

@visibleForTesting
  static void setMockInitialValues({

For PackageInfo implmentation we have to include below dependency in pubspec.yaml

package_info_plus: ^5.0.1

Upvotes: 0

Mohamed Inshaf
Mohamed Inshaf

Reputation: 395

PackageInfo.setMockInitialValues(appName: "abc", packageName: "com.example.example", version: "1.0", buildNumber: "2", buildSignature: "buildSignature");

Upvotes: 11

Nordmeyer
Nordmeyer

Reputation: 571

I delegated the PackageInfo access to a repository object. This repo then is easy to mock. This also works for package_info_plus.

Upvotes: 0

silvaric
silvaric

Reputation: 1708

Like Günter said, you can mock PackageInfo by installing a mock method handler in the MethodChannel for the plugin:

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;
  });
}

Upvotes: 15

Related Questions