Reputation: 482
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
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
Reputation: 395
PackageInfo.setMockInitialValues(appName: "abc", packageName: "com.example.example", version: "1.0", buildNumber: "2", buildSignature: "buildSignature");
Upvotes: 11
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
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