首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在测试中使用异步会产生一个错误,但是使用异步*可以让它正常工作吗?

在测试中使用异步会产生一个错误,但是使用异步*可以让它正常工作吗?
EN

Stack Overflow用户
提问于 2021-05-08 02:28:49
回答 3查看 2.3K关注 0票数 1

简而言之,我正在学习ResoCoder的TDD课程。这门课有点过时了,但我很确定,沿着这条路前进并做出调整是没问题的。本课程的课程和GitHub中的代码不是空安全的。

我也没有完全按照这条路走。我到处都做了些改变。

关于第二或第三集,我只是为了上下文而进入这门课程。

auth_usecases_test.dart

代码语言:javascript
复制
import 'package:dartz/dartz.dart';
import 'package:mockito/mockito.dart';
import 'package:storayge/core/auth/domain/entities/local_user.dart';
import 'package:storayge/core/auth/domain/repository/auth_repository.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:storayge/core/auth/domain/usecases/auth_usecases.dart';

class MockAuthRepository extends Mock implements AuthRepository {}

void main() {
  late GetLocalUserDataFromRemote usecase;
  late MockAuthRepository mockAuthRepository;

  late String tUid;
  late LocalUser tLocalUser;

  setUp(() {
    mockAuthRepository = MockAuthRepository();
    usecase = GetLocalUserDataFromRemote(repository: mockAuthRepository);
    tLocalUser = const LocalUser(
      username: 'testUsername',
      email: 'testEmail@Email',
      uid: 'testUid',
    );
    tUid = 'testUid';
  });

  test(
    'should get LocalUser data from the repository',
    () async* {
      // arrange
      when(mockAuthRepository.getLocalUserDataFromRemote(uid: tUid))
          .thenAnswer((_) async => Right(tLocalUser));
      // act
      final result = await usecase(Params(uid: tUid));
      // assert
      expect(result, equals(Right(tLocalUser)));
      verify(mockAuthRepository.getLocalUserDataFromRemote(uid: tUid));
      verifyNoMoreInteractions(mockAuthRepository);
    },
  );
}

这是“工作”代码。如果我将async*关键字更改为async,则会产生以下错误:

代码语言:javascript
复制
type 'Null' is not a subtype of type 'Future<Either<Failure, LocalUser>>'

auth_usecases.dart

代码语言:javascript
复制
class GetLocalUserDataFromRemote implements Usecase<LocalUser, Params> {
  final AuthRepository repository;

  GetLocalUserDataFromRemote({required this.repository});

  @override
  Future<Either<Failure, LocalUser>> call(Params params) async {
    return repository.getLocalUserDataFromRemote(uid: params.uid);
  }
}

class Params extends Equatable {
  final String uid;

  Params({required this.uid});

  @override
  List<Object?> get props => [uid];
}

auth_repository.dart

代码语言:javascript
复制
import 'package:dartz/dartz.dart';

import '../../../errors/failures.dart';
import '../entities/local_user.dart';

abstract class AuthRepository {
  Future<Either<Failure, LocalUser>> getLocalUserDataFromRemote({
    required String uid,
  });

  Future<Either<Failure, LocalUser>> signInWithEmailAndPassword({
    required String email,
    required String password,
  });
}

local_user.dart

代码语言:javascript
复制
class LocalUser extends Equatable {
  final String username;
  final String email;
  final String uid;

  const LocalUser({
    required this.username,
    required this.email,
    required this.uid,
  });

  @override
  List<Object?> get props => [username, email, uid];
}

failures.dart

代码语言:javascript
复制
abstract class Failure extends Equatable {
  final List<Object> properties;

  const Failure({required this.properties});

  @override
  List<Object> get props => properties;
}

为什么以及如何更改异步标记使其工作?我很困惑。

编辑:我的软件包目前都是最新的,声音为空安全。除了dartz,它使用0.1.0-nullsafety.1。

编辑2:一些更新。首先,似乎使用异步*标记可以通过测试,但它似乎不起作用。我的意思是,即使在不应该通过的情况下,测试也会通过。我想我已经找到解决办法了。当然是我的错。mockito文档表示mockito确实支持空安全,但需要一些代码生成。使用自定义的模拟类之类的。我什么也没做,这是愚蠢的,我恨自己。因此,我做了一些,并在稍后更新。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-15 00:47:48

好吧。我终于找到了答案。是的,这是我自己的愚蠢错误。基本上,mockito 5.0.0现在确实支持空安全,但有一些警告。您需要使用一些代码生成来生成模拟类。但我没有。基本上我所做的是

代码语言:javascript
复制
class MockAuthRepository extends Mock implements AuthRepository {} // remove

@GenerateMocks([AuthRepository]) //new
void main() {
  late GetLocalUserDataFromRemote usecase;
  late MockAuthRepository mockAuthRepository;

  late String tUid;
  late LocalUser tLocalUser;

  setUp(() {
    mockAuthRepository = MockAuthRepository();
    usecase = GetLocalUserDataFromRemote(repository: mockAuthRepository);
    tLocalUser = const LocalUser(
      username: 'testUsername',
      email: 'testEmail@Email',
      uid: 'testUid',
    );
    tUid = 'testUid';
  });

  test(
    'should get LocalUser data from the repository',
    () async {
      // arrange
      when(mockAuthRepository.getLocalUserDataFromRemote(anyNamed('uid')))
          .thenAnswer((_) async => Right(tLocalUser));
      // act
      final result = await usecase(Params(uid: tUid));
      // assert
      expect(result, equals(Right(tLocalUser)));
      verify(mockAuthRepository.getLocalUserDataFromRemote(uid: tUid));
      verifyNoMoreInteractions(mockAuthRepository);
    },
  );
}

并通过构建运行程序生成它。这很容易。我就是这么笨,没有仔细看医生。

票数 4
EN

Stack Overflow用户

发布于 2021-05-08 04:06:29

我觉得这是个莫克托失败。

尝试以mockito博士状态的方式调用您的代码:

代码语言:javascript
复制
      // arrange
      when(mockAuthRepository.getLocalUserDataFromRemote(uid: anyNamed('uid')))
          .thenAnswer((_) async => Right(tLocalUser));
票数 0
EN

Stack Overflow用户

发布于 2022-01-28 19:50:09

我认为这是因为流在BLoC中起作用。在mapEventToState函数中有异步*,之后还可以进行更多异步操作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67443531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档