【发布时间】:2019-11-21 08:43:16
【问题描述】:
我想测试我的小部件。在我的 HomePage 小部件中,有一个调用 API 的方法,然后它将在这个小部件中显示结果。这是主页小部件的代码
class HomePage extends StatefulWidget {
WebScraper _webScraper = WebScraper();
HomePage();
HomePage.forTest(Client client) {
_webScraper.client = client;
}
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
List<Post> posts = [];
bool isPostLoaded = false;
@override
void initState() {
super.initState();
_onRefresh();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: <Widget>[
Expanded(
child: RefreshIndicator(
child: isPostLoaded ? ListView.builder(
key: Key('post-list'),
itemCount: posts.length,
itemBuilder: (context, index) {
return Card(
key: Key(posts[index].id.toString()),
child: Column(
children: <Widget>[
Text(posts[index].title),
Text(posts[index].content),
Row(
children: <Widget>[
// some code
],
)
],
),
);
},
) : CircularProgressIndicator(),
onRefresh: _onRefresh),
),
],
),
);
}
Future<void> _onRefresh() async {
List<Post> postFromWebsite =
await this.widget._webScraper.getPostsFromWebsite();
if (postFromWebsite.length > 0) {
setState(() {
posts = postFromWebsite;
isPostLoaded = true;
});
}
}
这是我的测试代码
void main() {
var homeHttpMock;
setUp(() {
MockClient client = MockClient((request) async {
String html =
await rootBundle.loadString('test_resources/test.html');
return Response(html, 200);
});
homeHttpMock = MediaQuery(
data: MediaQueryData(),
child: MaterialApp(
home: HomePage.forTest(client),
),
);
});
testWidgets('Show post inside card in the list view',
(WidgetTester tester) async {
await tester.pumpWidget(homeHttpMock);
await tester.pump();
final listView = find.byKey(Key('post-list'));
expect(listView, findsOneWidget);
});
我尝试使用tester.runAsync、tester.pump 和持续时间、tester.pumpAndSettle(这个将超时)和FakeAsync,但这些方法不适用于我的小部件测试,它将引导我的测试失败。
提前谢谢你
【问题讨论】: