У меня есть вспомогательный класс (в Dart), как показано ниже:
class AppInfoHelper {
Future<String> getAppName() async {
return getPackageInfo().then((info) => info.appName);
}
Future<String> getAppVersion() async {
return getPackageInfo().then((info) => info.version);
}
Future<String> getBuildNumber() async {
return getPackageInfo().then((info) => info.buildNumber);
}
Future<PackageInfo> getPackageInfo() async => PackageInfo.fromPlatform();
}
В обязанности этого класса входит предоставление информации о приложении. Я использую PackageInfo как одну из библиотек. И по некоторым причинам я не буду указывать PackageInfo в качестве параметра конструктора.
Как я могу написать правильный модульный тест для этого класса? Я не уверен, как сделать заглушку, поскольку метод getPackageInfo() исходит из самого тестируемого класса.
Примечание:
Я использую mockito (https://pub.dev/packages/mockito), и в некоторых ссылках упоминается о выполнении чего-то вроде spy, но я не думаю, что это доступно в Dart/Flutter mockito.





Во-первых, если вы не предоставите экземпляр PackageInfo своему классу, вам придется создать свой собственный MockAppInfoHelper, который позволит вам использовать поддельный класс PackageInfo.
Вот пример реализации:
class MockAppInfoHelper extends AppInfoHelper {
MockAppInfoHelper(this._packageInfo);
final PackageInfo _packageInfo;
@override
Future<PackageInfo> getPackageInfo() async => _packageInfo;
}
И чтобы смоделировать поддельный класс PackageInfo, вам нужно создать несколько макетов, добавив аннотацию GenerateMocks и запустив build_runner:
@GenerateMocks([PackageInfo])
import 'app_info_helper_test.mocks.dart'; // note that the name might change if your base file is not named app_info_helper_test
Теперь вы можете начать писать свой тестовый метод, вот пример теста для getAppName:
void main() {
group('AppInfoHelper', () {
late MockPackageInfo mockPackageInfo;
late MockAppInfoHelper mockAppInfoHelper;
/// setUp is called before each test, it'll ensure that the mock is reset.
setUp(() {
mockPackageInfo = MockPackageInfo();
mockAppInfoHelper = MockAppInfoHelper(mockPackageInfo);
});
test('test getAppName', () async {
const testAppName = 'testAppName';
// First arrange the mock to return the expected value.
when(mockPackageInfo.appName).thenReturn(testAppName);
// Then call the method you want to test.
final result = await mockAppInfoHelper.getAppName();
// Finally verify that the mock was called as expected.
verify(mockPackageInfo.appName);
expect(result, testAppName);
});
});
}