我被小部件测试困住了,我可以使用一些帮助
来重现该行为,请运行下面的代码示例
import \'package:flutter/material.dart\';\nimport \'package:hooks_riverpod/hooks_riverpod.dart\';\nimport \'home_page.dart\';\n\nvoid main() => runApp(\n const ProviderScope(\n child: MaterialApp(\n home: Material(\n child: MyHomePage(),\n ),\n ),\n ),\n );\nRun Code Online (Sandbox Code Playgroud)\nimport \'dart:math\';\nimport \'package:flutter/material.dart\';\nimport \'package:flutter_hooks/flutter_hooks.dart\';\nimport \'package:hooks_riverpod/hooks_riverpod.dart\';\n\nextension RoundX on double {\n double roundToPrecision(int n) {\n final f = pow(10, n);\n return (this * f).round() / f;\n }\n}\n\nfinal tasksPod = Provider<List<Future<void> Function()>>(\n (ref) => [\n for (var i = 0; i < 10; ++i)\n () async {\n await Future.delayed(kThemeAnimationDuration);\n }\n ],\n);\n\nfinal progressPod = Provider.autoDispose<ValueNotifier<double>>((ref) {\n final notifier = ValueNotifier<double>(0);\n …Run Code Online (Sandbox Code Playgroud) await widgetTester.tap(find.byType(ElevatedButton));
Run Code Online (Sandbox Code Playgroud)
显示警告:也许该小部件实际上不在屏幕上,或者另一个小部件遮挡了它,或者该小部件无法接收指针事件。
我正在尝试为屏幕而不是主应用程序编写小部件测试。这是我第一次编写小部件测试,我找不到该问题的正确解决方案。我不知道如何为此编写适当的测试。我尝试编写一个简单的小部件测试,但最终给出了如下错误“警告:此套件中至少有一个测试创建了一个 HttpClient。当运行使用 TestWidgetsFlutterBinding 的测试套件时,所有 HTTP 请求都将返回状态代码 400,并且实际上不会发出任何网络请求。任何期望真实网络连接和状态代码的测试都将失败。要测试需要 HttpClient 的代码,请向被测代码提供您自己的 HttpClient 实现,以便您的测试能够一致地提供可测试的对被测代码的响应。” 我刚刚开始学习,请帮助我。注意:我的测试只是编写一个用于查找文本小部件的基本测试。
class BookingDetails extends StatefulWidget {
final booking;
BookingDetails(this.booking);
@override
_BookingDetailsState createState() => _BookingDetailsState();
}
class _BookingDetailsState extends State<BookingDetails>
with AutomaticKeepAliveClientMixin {
Row _buildTeacherInfo(Map<String, dynamic> teacherData) {
return teacherData != null
? Row(
children: <Widget>[
CircleAvatar(
radius: 53,
backgroundColor: MyColors.primary,
child: CircleAvatar(
radius: 50.0,
backgroundImage: teacherData['user']['img_url'] == null ||
teacherData['user']['img_url'] == ''
? AssetImage('assets/images/placeholder_avatar.png')
: NetworkImage(teacherData['user']['img_url']),
backgroundColor: Colors.transparent,
),
),
SizedBox(width: 20.0),
Column(
children: <Widget>[
Container(
child: Column(
children: …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的小部件测试,我可以使用 找到小部件actionKey,但是点击测试失败并且tapped在 后值为 false tester.tap(...),我的测试有什么问题?
testWidgets('some test', (WidgetTester tester) async {
final UniqueKey actionKey = UniqueKey();
bool tapped = false;
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: SlidableListItem(
child: const ListTile(title: Text('item')),
actions: <Widget>[
InkWell(
key: actionKey,
child: const Text('action'),
onTap: () => tapped = true,
),
],
),
),
));
await tester.tap(find.byKey(actionKey));
await tester.pump();
expect(find.byKey(actionKey), findsOneWidget);
expect(tapped, isTrue); <- failes
});
Run Code Online (Sandbox Code Playgroud)
The following TestFailure object was thrown running a test:
Expected: true
Actual: <false>
Run Code Online (Sandbox Code Playgroud) 在我的州立课上,我宣布了一个未来:
\nFuture<void> _testFuture;\nRun Code Online (Sandbox Code Playgroud)\n并像这样分配它initState:
super.initState();\n\n_testFuture = Future(() async {\n await Future.value(1); //can be any computation\n });\nRun Code Online (Sandbox Code Playgroud)\n并像这样使用它FutureBuilder:
FutureBuilder(\n future: _testFuture,\n builder: (context, snapshot) {\n if (snapshot.connectionState == ConnectionState.done)\n return Text('Hi');\n else\n return Center(\n child: CircularProgressIndicator(),\n );\n },\n ),\nRun Code Online (Sandbox Code Playgroud)\n正常运行应用程序时效果很好,flutter run但是当我尝试使用以下方法测试小部件时flutter test test/widget_test.dart:
void main() {\n testWidgets('Testing', (WidgetTester tester) async {\n // Build our app and trigger a frame.\n await tester.runAsync(() async {\n await tester.pumpWidget(MyApp());\n await …Run Code Online (Sandbox Code Playgroud)
\n我在尝试测试我的 Flutter 应用程序时遇到错误。我有一个自定义小部件,位于CustomScrollView小部件的底部(第一个视口之外)。在我的测试中,我想验证它是否确实存在。
\n我已经尝试过使用WidgetTester.scrollUntilVisibleas WidgetTester.drag(就像在flutter框架的测试中所做的那样)。此外,我尝试重构我的测试,但这FlutterDriver完全搞乱了其他一切。
\n如何滚动到CustomScrollView测试内部的底部?
\n这个最小的复制显示了包含 的应用程序,该应用CustomScrollView程序具有一个屏幕高度的容器小部件(以便我要查找的小部件不在初始视图中)
void main() {\n runApp(MyApp());\n}\n\nclass MyApp extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return MaterialApp(\n home: Scaffold(\n body: CustomScrollView(\n slivers: [\n SliverToBoxAdapter(\n child: Container(\n height: MediaQuery.of(context).size.height,\n ),\n ),\n MyWidget(),\n ],\n )),\n );\n }\n}\n\nclass MyWidget extends StatelessWidget {\n @override\n Widget build(BuildContext context) {\n return SliverToBoxAdapter(\n child: Container(\n height: 100,\n width: 100,\n ),\n );\n }\n}\n\nRun Code Online (Sandbox Code Playgroud)\n这是我最初编写的用于查找小部件的测试,当然失败了。
\nvoid main() {\n testWidgets('main …Run Code Online (Sandbox Code Playgroud) flutter flutter-test customscrollview widget-test-flutter flutter-integration-test
就我而言,当我使用 时ExpansionPanelList,我需要检查面板内的小部件是否可见。
如果不可见,tester.tap(find.text('More Info'))将抛出异常:
Warning: A call to tap() with finder "exactly one widget with text "More Info" (ignoring offstage widgets): Text("More Info", dependencies: [MediaQuery, DefaultTextStyle])" derived an Offset (Offset(400.0, 641.8)) that would not hit test on the specified widget. Maybe the widget is actually off-screen, or another widget is obscuring it, or the widget cannot receive pointer events. Indeed, Offset(400.0, 641.8) is outside the bounds of the root of the render tree, Size(800.0, 600.0). The …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用FlatButton.icon(Flutter docs)创建了一个按钮。现在我试图在测试期间找到按钮。
我试过了
find.byType(MaterialButton); // -> zero widgets
find.byType(FlatButton); // -> zero widget
Run Code Online (Sandbox Code Playgroud)
奇怪的是我可以找到按钮的文字
find.text('my button text');
Run Code Online (Sandbox Code Playgroud)
我还可以找到按钮的图标
find.byType('Icon');
Run Code Online (Sandbox Code Playgroud)
我不确定我应该搜索什么才能找到按钮。
我想用阴影渲染一些 Flutter 黄金文件。我怎样才能做到这一点?
默认情况下禁用阴影: https://github.com/flutter/flutter/blob/master/packages/flutter_test/lib/src/binding.dart#L942
我正在开发一个 flutter web 项目,我有一个小部件,我想编写测试。该小部件正在使用 ,MouseRegion当用户将其悬停或未悬停时,该小部件会执行一些操作。
举个例子:
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
bool isHovered = false;
@override
Widget build(BuildContext context) {
return MouseRegion(
onExit: (_) {
setState(() {
isHovered = false;
});
},
onEnter: (_) {
setState(() {
isHovered = true;
});
},
child: Container(
color: isHovered ? Colors.blue : Colors.red,
height: 50,
width: 50,
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以编写一个小部件测试来测试我的容器是红色的:
testWidgets('MyWidget should be red by default', (WidgetTester tester) …Run Code Online (Sandbox Code Playgroud)