flutter - 如何在 Flutter 中测试使用 DateTime.now 的代码?
问题描述
我有这堂课:
import 'package:flutter/material.dart';
class AgeText extends StatelessWidget {
final String dateOfBirth;
const AgeText({Key key, @required this.dateOfBirth}) : super(key: key);
@override
Widget build(BuildContext context) {
final age = _calculateAge();
return Text(age.toString());
}
int _calculateAge() {
final dateOfBirthDate = DateTime.parse(dateOfBirth);
final difference = DateTime.now().difference(dateOfBirthDate);
final age = difference.inDays / 365;
return age.floor();
}
}
我想测试它是否会在传递出生日期时产生正确的年龄。在 Flutter 中执行此操作的最佳方法是什么?
解决方案:对于那些感兴趣的人,这里是使用@Günter Zöchbauer 对时钟包的建议的解决方案。
我的小部件类:
import 'package:flutter/material.dart';
import 'package:clock/clock.dart';
class AgeText extends StatelessWidget {
final String dateOfBirth;
final Clock clock;
const AgeText({Key key, @required this.dateOfBirth, this.clock = const Clock()}) : super(key: key);
@override
Widget build(BuildContext context) {
final age = _calculateAge();
return Text(age.toString());
}
int _calculateAge() {
final dateOfBirthDate = DateTime.parse(dateOfBirth);
final difference = clock.now().difference(dateOfBirthDate);
final age = difference.inDays / 365;
return age.floor();
}
}
和我的测试课:
import 'package:clock/clock.dart';
import 'package:flutter/material.dart';
import 'package:flutter_app/age.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets("shows age 30 when date of birth is 30 years ago", (WidgetTester tester) async {
final mockClock = Clock.fixed(DateTime(2000, 01, 01));
final testableWidget = MaterialApp(
home: AgeText(
dateOfBirth: "1970-01-01T00:00:00",
clock: mockClock,
),
);
await tester.pumpWidget(testableWidget);
expect(find.text("30"), findsOneWidget);
});
}
解决方案
如果您将时钟包用于代码,则取决于DateTime.now()
您可以轻松地模拟它。
我认为没有包装提供的DateTime.now()
licke包装的好方法clock
。
推荐阅读
- reactjs - 反应更糟糕的做法:更胖的状态或 DOM 操作?
- python-3.x - 接收到的消息与通过串行连接发送的消息不同
- asp.net-core - Azure 管道缺少引用
- mysql - 使用状态在 React 中显示节点 MySQL 结果
- excel - 如何根据行值自动隐藏列,该行值基于对面工作表中的 if 函数?
- javascript - 如何迭代 XMLHttpRequest?
- android - 有没有办法从 Genymotion 虚拟机中恢复我的应用程序?
- laravel - Laravel按月分组的列集合总和
- javascript - 切换 SVG 图标的颜色
- c# - Selenium WebDriver 在重定向期间没有响应