为抛出Exception的代码提供await会在Flutter中产生错误

pn9klfpd  于 2023-06-30  发布在  Flutter
关注(0)|答案(1)|浏览(100)

我是一个初学者扑发展。我想了解一下这背后的逻辑:
下面提供的代码是一个基本的代码,我写的理解错误,我在单元测试我的AuthProvider
在调试时,为provider.createUser()提供await关键字会重定向到remote_listener.dartinvoker.dart中的await语句。使用此逻辑进行单元测试时,测试失败。
我的问题:为什么我们应该避免在单元测试时抛出异常的代码中使用await

void main() async {

  final provider = MockAuthProvider();
  final result = await provider.createUser(
    email: 'email@email.com',
    password: 'testPassword',
  );

}

class MockAuthProvider {

Future<AuthUser> createUser({
    required String email,
    required String password,
  }) async {

    if (!isInitialized) throw NotInitializedException();
    await Future.delayed(const Duration(seconds: 1));
    const user = AuthUser(email: 'email@email.com', isEmailVerified: false);
    return user;
}
t1qtbnec

t1qtbnec1#

这个代码基本上是正确的。有几件事你可以做,使它更强大,解决你的问题,虽然。
这里有一个选择:

void main() async {

  final provider = MockAuthProvider();
  AuthUser? result;

  try {
   result = await provider.createUser(
      email: 'email@email.com',
      password: 'testPassword',
    );
  } catch (e) {
    // Handle the error
  }

  if (result == null) // Handle the null case

}

class MockAuthProvider {

Future<AuthUser> createUser({
    required String email,
    required String password,
  }) async {

    if (!isInitialized) throw NotInitializedException();
    await Future.delayed(const Duration(seconds: 1));
    const user = AuthUser(email: 'email@email.com', isEmailVerified: false);
    return user;
}

另一个选择是在createUser方法中处理错误:

void main() async {

  final provider = MockAuthProvider();
  final result = await provider.createUser(
    email: 'email@email.com',
    password: 'testPassword',
  );
  
  if (result == null) // Handle the null case
}

class MockAuthProvider {

Future<AuthUser?> createUser({
    required String email,
    required String password,
  }) async {
    AuthUser? user;
    try {
      if (!isInitialized) throw NotInitializedException();
      await Future.delayed(const Duration(seconds: 1));
      user = AuthUser(email: 'email@email.com', isEmailVerified: false);
      return user;
    } catch (e) {
      // Handle the error here
    }

    return user;
}

相关问题