第一件事
该软件包非常尊重 react-hooks-testing-library。因此,这个想法基于它。
问题
您正在编写一个很棒的自定义 Hook,并希望对其进行测试,但一旦调用它,您就会看到
如下错误:
Invariant Violation: Hooks can only be called inside the body of a function component.(Hook 只能在函数组件的主体内调用。)
您真的不想仅为测试该 Hook 而编写一个组件,并且不得不弄清楚如何
触发 Hook 可以更新的所有各种方式,尤其是在考虑了
您如何将所有内容连接在一起的复杂性时。
解决方案
Flutter Hooks Testing Library 允许您为 Flutter Hooks 创建一个简单的测试工具,该工具
负责在函数组件的主体内运行它们,并提供各种有用的
实用函数来更新输入并检索您出色的自定义 Hook 的输出。
该库旨在提供尽可能接近在真实组件中原生使用 Hook 的测试体验
从组件内部。
使用此库,您无需关心如何构造、渲染或与
Flutter 组件进行交互来测试您的 Hook。您只需直接使用 Hook 并断言
结果。
何时使用此库
- 您正在编写一个包含一个或多个与组件无直接关联的自定义 Hook 的库
- 您有一个难以通过组件交互进行测试的复杂 Hook
何时不使用此库
- 您的 Hook 与组件一起定义,并且仅在那里使用
- 通过测试使用它的组件,可以轻松测试您的 Hook
安装
dev_dependencies:
flutter_hooks_test: ^0.0.1
示例
use_update.dart
VoidCallback useUpdate() {
final attempt = useState(0);
return () => attempt.value++;
}
use_update_test.dart
未使用的
testWidgets('should re-build component each time returned function is called', (tester) async {
// Before
const key = Key('button');
var buildCount = 0;
// called count is 1
await tester.pumpWidget(HookBuilder(builder: (context) {
final update = useUpdate();
buildCount++;
return GestureDetector(
key: key,
onTap: () => update(),
);
}));
// called count is 2
await tester.tap(find.byKey(key));
await tester.pumpAndSettle(const Duration(milliseconds: 1));
expect(buildCount, 2);
});
使用方法
testWidgets('should re-build component each time returned function is called', (tester) async {
// After
var buildCount = 0;
final result = await buildHook((_) {
buildCount++;
return useUpdate();
});
expect(buildCount, 1);
final update = result.current;
await act(() => update());
expect(buildCount, 2);
});
问题
请在我们的 问题跟踪器 中提交特定于 Flutter Hooks Testing Library 的问题、错误或功能请求。
非特定于 Flutter Hooks Testing Library 的插件问题可以在 Flutter 问题跟踪器 中提交。
贡献
如果您希望为此仓库中的任何现有插件贡献更改,
请查阅我们的 贡献指南
并打开一个 拉取请求。
