“Null”不是“Future<Either<Failure, NumberTrivia>>”类型的子类型

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 课程零安全版本​​。

ResoCoder TDD 课程(零安全)

如果有帮助请告诉我。

  • 虽然此链接可以回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会变得无效。- [来自评论](/review/late-answers/30013821) (2认同)