Flutter 如何测试使用DateTime.now的代码?

Flutter 如何测试使用DateTime.now的代码?,flutter,flutter-test,Flutter,Flutter Test,我有这门课: 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) { fin

我有这门课:

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();
  }
}
我想测试一下,当把出生日期传给它时,它是否能产生正确的年龄。在Flatter中执行此操作的最佳方法是什么


解决方案:对于那些感兴趣的人,这里是使用@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()
点击
clock
包提供的。

正如这里提到的:在DateTime上实现扩展

extension CustomizableDateTime on DateTime {
  static DateTime _customTime;
  static DateTime get current {
    return _customTime ?? DateTime.now();
  }

  static set customTime(DateTime customTime) {
    _customTime = customTime;
  }
}
然后只需在生产代码中使用
customizedDateTime.current
。您可以在测试中修改返回值,如下所示:
customabledatetime.customTime=DateTime.parse(“1969-07-20:18:04”)。不需要使用第三方库。

正如Günther所说,由Dart团队维护,提供了一种非常简洁的方法来实现这一点

正常使用:

导入“包:clock/clock.dart”;
void main(){
//打印当前日期和时间
打印(clock.now());
}
覆盖当前时间:

导入“包:clock/clock.dart”;
void main(){
带时钟(
固定时钟(日期时间(2000)),
() {
//始终打印2000-01-01 00:00:00。
打印(clock.now());
},
);
}
我写的更详细


对于小部件测试,您需要将
pumpWidget
pump
expect
包装在
withClock
回调中。

更简洁地说:
返回自定义时间??DateTime.now()优秀文章。