Flutter 联合测试颤振/飞镖未来误差的正确方法是什么?

Flutter 联合测试颤振/飞镖未来误差的正确方法是什么?,flutter,asynchronous,dart,flutter-test,Flutter,Asynchronous,Dart,Flutter Test,我正在编写的单元测试应该在异常时失败,我希望使用匹配器匹配抛出的错误,但我得到了一个错误 我现在做错了什么?这里的错误是什么? 如果我做得不正确,对于返回未来的方法,测试错误场景的正确方法是什么?为什么会有异步间隙 下面是我要测试的方法: Future<void> registerUser(String name, String email, String password) async { auth.signUp(email, password, name).then((_) {

我正在编写的单元测试应该在异常时失败,我希望使用匹配器匹配抛出的错误,但我得到了一个错误

我现在做错了什么?这里的错误是什么? 如果我做得不正确,对于返回未来的方法,测试错误场景的正确方法是什么?为什么会有异步间隙

下面是我要测试的方法:

Future<void> registerUser(String name, String email, String password) async {
auth.signUp(email, password, name).then((_) {
      auth.getCurrentUser().then((user) async {
        // Doing something
    }).catchError((onError) {
      throw onError;
    });
我得到这个错误:

package:mockito/src/mock.dart 403:7               PostExpectation.thenThrow.<fn>
package:mockito/src/mock.dart 130:45              Mock.noSuchMethod
package:dive/repository/register_repo.dart 25:12  RegisterRepository.registerUser.<fn>
===== asynchronous gap ===========================
dart:async                                        Future.then
package:dive/repository/register_repo.dart 24:40  RegisterRepository.registerUser
test/repository/register_repo_test.dart 61:20     main.<fn>.<fn>

Closure: (dynamic) => Null
package:mockito/src/mock.dart 403:7 postExpection.thenthorn。
包:mockito/src/mock.dart 130:45 mock.noSuchMethod
包:dive/repository/register_repo.dart 25:12 RegisterRepository.registerUser。
======异步间隙===========================
dart:async Future.then
包:dive/repository/register_repo.dart 24:40 RegisterRepository.registerUser
测试/存储库/注册存储测试。dart 61:20主。。
闭包:(动态)=>Null

对于将来面临此问题的任何其他人

  • 我从正在测试的方法中删除了async关键字,这里不需要async关键字。链接调用使其更具可读性:

  • 测试现在通过。

    感谢您演示如何捕获和测试Completer.completeError。我可以看到我的代码返回正确的东西,但我无法确定如何测试它。
    package:mockito/src/mock.dart 403:7               PostExpectation.thenThrow.<fn>
    package:mockito/src/mock.dart 130:45              Mock.noSuchMethod
    package:dive/repository/register_repo.dart 25:12  RegisterRepository.registerUser.<fn>
    ===== asynchronous gap ===========================
    dart:async                                        Future.then
    package:dive/repository/register_repo.dart 24:40  RegisterRepository.registerUser
    test/repository/register_repo_test.dart 61:20     main.<fn>.<fn>
    
    Closure: (dynamic) => Null
    
    Future<void> registerUser(String name, String email, String password) {
    return auth
            .signUp(email, password, name)
            .then((_) => auth.getCurrentUser())
            .then((user) {
            // Doing something
        }).catchError((onError) {
          throw onError;
        });
    
    test('should fail to register if fetching user fails', () async {
          MockAuth auth = MockAuth();
          RegisterRepository repo = RegisterRepository(auth);
    
          String password = 'password';
          String email = 'email';
          String name = 'name';
    
          when(auth.signUp(email, password, name))
              .thenAnswer((_) => Future.value());
          when(auth.getCurrentUser()).thenAnswer((_) => Future.error('error'));
    
          repo.registerUser(name, email, password).catchError((onError) {
            expect(onError.toString(), 'error');
    
            verify(auth.signUp(email, password, name)).called(1);
            verify(auth.getCurrentUser()).called(1);
            verifyNoMoreInteractions(auth);
          });
        });