flutter - 如何在 Flutter 中测试使用 DateTime.now 的代码?

标签 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) {
    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 的clock 建议的解决方案包裹。

我的小部件类:

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);
  });
}

最佳答案

如果您使用 clock代码包取决于 DateTime.now() 你可以轻松地模拟它。

除了围绕 DateTime.now() 创建自定义包装器之外,我认为没有比 clock 包提供的更好的方法了。

关于flutter - 如何在 Flutter 中测试使用 DateTime.now 的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53816067/

相关文章:

flutter 问题: How to change color of ExpansionTile?

flutter - 如何将jsonList中的Json转换为Dart模型?

Flutter integration_test - 制作截图

flutter - 有没有办法将 appbar 放在 flutter 的底部?

flutter - 如何从我的 flutter 项目中删除错误?

flutter - 如何验证 flutter 中的单个表单字段

redux - 我是否必须存储每个数据 redux

android - 在构建Home()时引发了以下NoSuchMethodError:在null上调用了 '>'方法。接收方:null尝试调用:>(1)

flutter - 如何在不同的屏幕尺寸上测试 Flutter widgets?

flutter - Dart/Flutter Web 单元测试错误 : Error: Not found: 'dart:html'