我正在为 Flutter 方法编写一个单元测试,该方法调用异步方法然后返回,让异步按时完成。我的测试“在完成后”失败了。
这是我的测试:
test('mark as viewed', () {
final a = Asset();
expect(a.viewed, false);
a.markAsViewed();
expect(a.viewed, true);
});
Run Code Online (Sandbox Code Playgroud)
这是它正在测试的方法:
void markAsViewed() {
viewed = true;
Repository.get().saveToStorage();
}
Run Code Online (Sandbox Code Playgroud)
该saveToStorage()方法是一个异步方法,我只是让它在后台执行。
我该如何进行这项工作?测试失败告诉我Make sure to use [expectAsync] or the [completes] matcher when testing async code.,但我不知道该怎么做。谁能解释一下或者指出我正确的文档吗?我找不到任何关于如何处理这些异步的信息,当它不是Future被返回时,而是被单独完成。
需要明确的是 - 这个单元测试并不是要测试它是否保存到存储中,只是对设置为 的基本viewed测试true。
已编辑
错误如下:
package:flutter/src/services/platform_channel.dart 319:7 MethodChannel.invokeMethod
===== asynchronous gap ===========================
dart:async _asyncErrorWrapperHelper
package:exec_pointers/asset_details.dart Repository.saveToStorage
package:exec_pointers/asset_details.dart 64:22 Asset.markAsViewed
test/asset_details_test.dart 57:9 main.<fn>.<fn>
This test failed after it had already completed. Make sure to use [expectAsync]
or the [completes] matcher when testing async code.
Run Code Online (Sandbox Code Playgroud)
该代码与实现问题紧密耦合,这使得隔离测试变得困难。
应该对其进行重构,以遵循更可靠的设计,并具有明确的依赖关系,可以在隔离测试(单元测试)时替换这些依赖关系
例如
class Asset {
Asset({Repository repository}) {
this.repository = repository;
}
final Repository repository;
bool viewed;
void markAsViewed() {
viewed = true;
repository.saveToStorage();
}
//...
}
Run Code Online (Sandbox Code Playgroud)
这样,在测试依赖项的模拟/存根时,可以用来避免任何不需要的行为。
// Create a Mock Repository using the Mock class provided by the Mockito package.
// Create new instances of this class in each test.
class MockRepository extends Mock implements Repository {}
main() {
test('mark as viewed', () {
final repo = MockRepository();
// Use Mockito to do nothing when it calls the repository
when(repo.saveToStorage())
.thenAnswer((_) async => { });
final subject = Asset(repo);
expect(subject.viewed, false);
subject.markAsViewed();
expect(subject.viewed, true);
//
verify(repo.saveToStorage());
});
}
Run Code Online (Sandbox Code Playgroud)
现在应该能够执行测试,而不会出现依赖项的意外行为。
参考单元测试简介
参考使用 Mockito 的 Mock 依赖项
参考mockito 4.1.1
| 归档时间: |
|
| 查看次数: |
5909 次 |
| 最近记录: |