Обеспечение покрытия кода в поблочном тестировании?

Ваша проблема в том, что ваш метод сборки возвращается до того, как ваше будущее getSharedPrefs будет завершено. GetSharedPrefs возвращается мгновенно, как только он вызывается, потому что он асинхронный, и вы рассматриваете его как «огонь и забыть», не ожидая. Видя, что вы не можете ждать в своей функции initState, которая имеет смысл.

Здесь вы хотите использовать виджет FutureBuilder. Создайте Future, который возвращает логическое значение (или enum, если вам нужно больше состояний), и используйте будущего строителя в качестве домашнего ребенка, чтобы вернуть правильный виджет.

Создайте свое будущее

Future<bool> showLoginPage() async {
  var sharedPreferences = await SharedPreferences.getInstance();

  // sharedPreferences.setString('user', 'hasuser');

  String user = sharedPreferences.getString('user');

  return user == null;
}

Когда пользователь имеет значение null, это вернет true. Используйте это будущее в построителе будущего, чтобы выслушать изменения стоимости и ответить соответствующим образом.

 @override
  Widget build(BuildContext context) {
    return MaterialApp(home: FutureBuilder<bool>(
     future: showLoginPage(),
     builder: (buildContext, snapshot) {
       if(snapshot.hasData) {
         if(snapshot.data){
           // Return your login here
        return Container(color: Colors.blue);
      }

      // Return your home here
      return Container(color: Colors.red);
    } else {

      // Return loading screen while reading preferences
      return Center(child: CircularProgressIndicator());
    }
  },
));
}

Я запустил этот код, и он отлично работает. Вы должны увидеть синий экран, когда требуется вход в систему, и красный экран, когда присутствует пользователь. Раскомментируйте строку в showLoginPage для тестирования.

25
задан Community 23 May 2017 в 12:02
поделиться

2 ответа

cover.py - очень удобный инструмент. Среди прочего, он обеспечивает покрытие филиала .

28
ответ дан Hank Gay 28 November 2019 в 21:00
поделиться

Есть ли у вас мандат от руководства быть догматичным в отношении получения 100% покрытия кода с помощью ваших тестовых случаев? Если нет, считаете ли вы, что прикосновение к каждой строке кода является наиболее эффективным способом поиска ошибок в вашем коде? Предполагая, что у вас нет бесконечных временных и людских ресурсов, вам, вероятно, следует сосредоточиться на разумном тестировании всего своего нетривиального кода с акцентом на части, которые, как известно разработчикам, было сложно написать или подвержены ошибкам.

Хотя охват кода велик, потому что вы, конечно, не можете сказать, что кусок кода проверяется, пока он не был затронут, я просто не приравниваю прикосновение к коду кода к его проверке. Я не против покрытия кода, но слишком легко упасть в использование покрытия кода в качестве показателя, чтобы узнать, когда тестирование будет завершено. Я думаю, что это было бы ошибкой.

18
ответ дан Brad Barker 28 November 2019 в 21:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: