gpt4 book ai didi

Flutter - Mockito - 在测试中使用 async 会产生错误,但使用 async* 可以正常工作吗?

转载 作者:行者123 更新时间:2023-12-03 08:22:32 25 4
gpt4 key购买 nike

简而言之,我正在学习 ResoCoder TDD 类(class)。该类(class)有点过时,但我很确定遵循并一路进行调整是可以的。本类(class)的类(class)和 GitHub 中的代码不是空安全的。

而且我没有完全按照类(class)进行。我在这里和那里做了一些更改。

我刚刚进入类(class)的第 2 或第 3 集以了解背景信息。

auth_usecases_test.dart

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 ,则会产生以下错误:

type 'Null' is not a subtype of type 'Future<Either<Failure, LocalUser>>'

auth_usecases.dart

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

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

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

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:一些更新。首先,似乎使用 async* 标签使测试通过,但它似乎实际上不起作用。我的意思是测试即使在不应该通过的情况下也通过了。我想我已经找到了解决方案。这当然是我的错。 mockito 文档说,mockito 确实支持 null 安全,但支持一些代码生成。使用自定义模拟类等等。我什么也没做,这很愚蠢,我讨厌自己。所以我会做一些事情并稍后更新。

最佳答案

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

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);
},
);
}

并使用构建运行程序生成它。这很容易。我就是太笨了,没有仔细阅读文档。

关于Flutter - Mockito - 在测试中使用 async 会产生错误,但使用 async* 可以正常工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67443531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com