Testing 颤振集成测试-按下列表行时检查图标类型已更改
我正在尝试Flitter,我基本上遵循了代码实验室的入门指南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
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中大致了解它们。集成测试是否仅限于屏幕上的文本检查?