Aki*_*han 4 testing tdd flutter clean-architecture flutter-test
我正在按照以下视频在 TDD Clean Architecture 中实施 flutter 项目:https://www.youtube.com/watch ?v=lPkWX8xFthE&t=1s
我的代码:
class MockNumberTriviaRepository extends Mock
implements NumberTriviaRepository {}
void main() {
late MockNumberTriviaRepository mockNumberTriviaRepository;
late GetConcreteNumberTrivia usecase;
setUp(() {
mockNumberTriviaRepository = MockNumberTriviaRepository();
usecase = GetConcreteNumberTrivia(mockNumberTriviaRepository);
});
final tNumber = 1;
final tNumberTrivia = NumberTrivia(text: 'test', number: 1);
test(
'should get trivia for the number from the repository',
() async {
//arrange
when( mockNumberTriviaRepository.getConcreteNumberTrivia(1)).thenAnswer((_) async {
return Right(tNumberTrivia);
});
//act
final result = await usecase.execute(number: 10);
//assert
expect(result, Right(tNumberTrivia));
verify(mockNumberTriviaRepository.getConcreteNumberTrivia(tNumber));
verifyNoMoreInteractions(mockNumberTriviaRepository);
},
);
}
Run Code Online (Sandbox Code Playgroud)
运行测试时,结果总是如下
package:number_trivia/features/number_trivia/domain/repositories/number_trivia_repository.dart 7:41 MockNumberTriviaRepository.getConcreteNumberTrivia
test\features\number_trivia\domain\usecases\get_concrete_number_trivia_test.dart 27:40 main.<fn>
test\features\number_trivia\domain\usecases\get_concrete_number_trivia_test.dart 25:5 main.<fn>
type 'Null' is not a subtype of type 'Future<Either<Failure, NumberTrivia>>'
Run Code Online (Sandbox Code Playgroud)
它在这里显示一个错误:
abstract class NumberTriviaRepository{
Future<Either<Failure, NumberTrivia>> getConcreteNumberTrivia(int number);
}
Run Code Online (Sandbox Code Playgroud)
class GetConcreteNumberTrivia {
final NumberTriviaRepository repository;
GetConcreteNumberTrivia(this.repository);
Future<Either<Failure, NumberTrivia>> execute({required int number}) async {
return await repository.getConcreteNumberTrivia(number);
}
}
Run Code Online (Sandbox Code Playgroud)
请给我一些解决方案以继续前进。
小智 5
我遇到了同样的错误,我做了一些研究,它终于对我有用。
如果遇到这样的错误,您需要进行“Null”检查。
为了使 Dart 将您的代码视为 null 安全,SDK 约束必须要求具有 null 安全支持的语言版本。例如,您的 pubspec.yaml 文件可能具有以下约束:
environment:
sdk: ">=2.12.0 <3.0.0"
Run Code Online (Sandbox Code Playgroud)
您应该通过在类型名称后添加问号 (?) 来为变量指定可为 null 的类型
abstract class NumberTriviaRepository {
Future<Either<Failure, NumberTrivia>>? getConcreateNumberTrivia(int number);
Future<Either<Failure, NumberTrivia>>? getRandomNumberTrivia();
}
Run Code Online (Sandbox Code Playgroud)
调用时必须使用“NumberTriviaRepository”中的函数。
class GetConcreateNumberTrivia {
final NumberTriviaRepository repository;
GetConcreateNumberTrivia(this.repository);
Future<Either<Failure, NumberTrivia>?> execute({required int number}) async {
return await repository.getConcreateNumberTrivia((number));
}
}
Run Code Online (Sandbox Code Playgroud)
我在下面添加了一些有用的链接。我希望你的问题得到解决。
小智 5
这是 ResoCoder TDD 课程零安全版本。
如果有帮助请告诉我。