2

我正在为登录屏幕实施小部件测试。在应用程序中,登录屏幕为用户提供了一个开关控件,用于设置生物识别的首选项(如果它们在设备上可用)。

我们正在研究 GetX,需要在小部件测试中测试此行为。登录屏幕是一个无状态小部件,它加载一个GetXController称为LoginViewController依赖项的子类。这个控制器类包含一个称为 的可观察布尔值canCheckBiometrics,有一个称为 settersetBiometrics(bool newValue)的方法,用于确定开关控件的存在。LoginView 无状态小部件使用包检查是否存在生物特征local_auth并相应地调用 setBiometrics。LoginView的代码摘录:

  final controller = Get.put(LoginViewController());

  Future<void> _checkForBiometrics() async {
    bool enabled = await localAuth.canCheckBiometrics;
    controller.setBiometrics(enabled);
  }

我想做的是LoginViewController在我的小部件测试中模拟类并setBiometrics根据需要调用来执行测试。以下是我的小部件测试的一部分:

class MockLoginViewController extends Mock implements LoginViewController {}

void main(){

  final controller = MockLoginViewController();

  setUp(() { });
  tearDown(() { });

  group('Controls are present and functioning', () {

    // ... other tests

  testWidgets('Biometrics switcher present conditionally', (tester) async {
    await tester.pumpWidget(const _LoginWrapper());
    var biometricsSwitch = find.byKey(UIKeys.keySwitchBiometrics);
    // if controller.canCheckBiometrics.value is true
    // controller.setBiometrics(true);
    // expect(biometricsSwitch, findsOneWidget);
    // if controller.canCheckBiometrics.value is false
    // controller.setBiometrics(false);
    // expect(biometricsSwitch, findsNothing);
  });

class _LoginWrapper extends StatelessWidget {
  const _LoginWrapper({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: LoginView());
  }
}

LoginView必须用 a 包裹以MaterialApp避免MediaQuery错误。

我的问题是:如何将MockLoginViewController类与正在测试的小部件相关联,以便我可以切换值并测试切换器的存在?还是我对这一切都错了?

注意:我试图尝试这个get_test包来帮助解决这个问题,但它不支持空安全,因此没有用。

4

0 回答 0