Testing 颤振集成测试-按下列表行时检查图标类型已更改

Testing 颤振集成测试-按下列表行时检查图标类型已更改,testing,flutter,dart,integration-testing,Testing,Flutter,Dart,Integration Testing,我正在尝试Flitter,我基本上遵循了代码实验室的入门指南 但我正在尝试向它添加一些集成测试。基本上,我想检查当按下列表行时图标是否为Icons.favorite。我遇到的所有其他示例都只查看屏幕上的文本检查。以下是测试文件: import 'package:flutter_driver/flutter_driver.dart'; import 'package:test/test.dart'; void main() { group('My App', () { fin

我正在尝试Flitter,我基本上遵循了代码实验室的入门指南

但我正在尝试向它添加一些集成测试。基本上,我想检查当按下列表行时图标是否为Icons.favorite。我遇到的所有其他示例都只查看屏幕上的文本检查。以下是测试文件:

import 'package:flutter_driver/flutter_driver.dart';
import 'package:test/test.dart';

void main() {
  group('My App', () {
    final firstListItem = find.byValueKey('list_title_0');

    FlutterDriver driver;

    setUpAll(() async {
      driver = await FlutterDriver.connect();
    });

    tearDownAll(() async {
      if (driver != null) {
        driver.close();
      }
    });

    test('name is favourited', () async {
      await driver.tap(firstListItem);

      final SerializableFinder firstFavourite = find.byValueKey('favourite_0_saved');

      await driver.waitFor(firstFavourite);

      // not sure what to expect for here..
    });
  });
}
下面是应用程序的代码。基本上是代码实验室的代码。我所做的唯一更改是在
图标中添加了
,这样我就可以在测试期间将其用于finder

import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Startup Name Generator',
      home: RandomWords(),
    );
  }
}

class RandomWords extends StatefulWidget {
  @override
  RandomWordsState createState() => RandomWordsState();
}

class RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[];
  final Set<WordPair> _saved = Set<WordPair>();
  final _biggerFont = const TextStyle(fontSize: 18.0);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Startup Name Generator'),
        actions: <Widget>[
          IconButton(icon: Icon(Icons.list), onPressed: _pushSaved),
        ],
      ),
      body: _buildSuggestions(),
    );
  }

  void _pushSaved() {
    Navigator.of(context).push(
      MaterialPageRoute<void>(builder: 
        (BuildContext context) {
          final Iterable<ListTile> tiles = _saved.map((WordPair pair) {
            return ListTile(
              title: Text(
                pair.asPascalCase,
                style: _biggerFont,
              ),
            );
          });
          final List<Widget> divided = ListTile.divideTiles(
            context: context,
            tiles: tiles
          ).toList();

          return Scaffold(
            appBar: AppBar(
              title: Text('Saved Suggestions'),
            ),
            body: ListView(children: divided),
          );
        }
      )
    );
  }

  Widget _buildSuggestions() {
    return ListView.builder(
      padding: const EdgeInsets.all(16.0),
      itemBuilder: (context, i) {
        if (i.isOdd) return Divider();

        final index = i ~/ 2;
        if (index >= _suggestions.length) {
          _suggestions.addAll(generateWordPairs().take(10));
        }
        return _buildRow(_suggestions[index], i);
      },
    );
  }

  Widget _buildRow(WordPair pair, int i) {
    final bool alreadySaved = _saved.contains(pair);

    return ListTile(
      title: Text(
        pair.asPascalCase,
        style: _biggerFont,
      ),
      key: Key('list_title_$i'),
      trailing: Icon(
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null,
        key: alreadySaved ? Key('favourite_${i}_saved') : Key('favourite_${i}_unsaved'),
      ),
      onTap: () {
        setState(() {
          if (alreadySaved) {
            _saved.remove(pair);
          } else {
            _saved.add(pair);
          }
        });
      },
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“package:english_words/english_words.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“启动名称生成器”,
home:RandomWords(),
);
}
}
类RandomWords扩展了StatefulWidget{
@凌驾
RandomWordsState createState()=>RandomWordsState();
}
类RandomWordsState扩展状态{
最终建议=[];
最终集_saved=Set();
final _biggerFont=const TextStyle(字体大小:18.0);
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“启动名称生成器”),
行动:[
图标按钮(图标:图标(Icons.list),ON按下:_pushSaved),
],
),
正文:_buildSuggestions(),
);
}
作废(){
导航器.of(上下文).push(
MaterialPage路线(建筑商:
(构建上下文){
final Iterable tiles=\u saved.map((字对){
返回列表块(
标题:正文(
pair.asPascalCase,
风格:_biggerFont,
),
);
});
最终列表分割=ListTile.divideTiles(
上下文:上下文,
瓷砖:瓷砖
).toList();
返回脚手架(
appBar:appBar(
标题:文本(“保存的建议”),
),
正文:列表视图(子项:已分割),
);
}
)
);
}
小部件_buildSuggestions(){
返回ListView.builder(
填充:常数边集全部(16.0),
itemBuilder:(上下文,i){
如果(i.isOdd)返回分隔符();
最终指数=i~/2;
如果(索引>=\u建议长度){
_建议.addAll(generateWordPairs().take(10));
}
返回_buildRow(_建议[索引],i);
},
);
}
Widget\u buildRow(字对,int i){
最终bool alreadySaved=\u saved.contains(成对);
返回列表块(
标题:正文(
pair.asPascalCase,
风格:_biggerFont,
),
key:key('list_title_$i'),
尾随:图标(
alreadySaved?Icons.favorite:Icons.favorite_边框,
颜色:已保存?颜色。红色:空,
key:alreadySaved?key('favorite{i}{u saved'):key('favorite{i}{u unsaved'),
),
onTap:(){
设置状态(){
如果(已保存){
_保存。删除(对);
}否则{
_保存。添加(对);
}
});
},
);
}
}

您不需要为此进行集成测试–小部件测试也可以,而不需要模拟器。@RémiRousselet,是的,我考虑过单元测试。虽然我只是想玩一下集成测试,以便在flifter中大致了解它们。集成测试是否仅限于屏幕上的文本检查?您不需要为此进行集成测试–小部件测试也可以,而不需要模拟器。@RémiRousselet,是的,我考虑过单元测试。虽然我只是想玩一下集成测试,以便在flifter中大致了解它们。集成测试是否仅限于屏幕上的文本检查?