Дротик — запутаться в результате теста

#flutter #unit-testing #dart #inheritance

Вопрос:

Приношу извинения, если это совершенно неуместный вопрос, но я не могу найти решение следующей проблемы:

Результат теста:

Ожидаемое: <Экземпляр «Будущего< Результата регистрации >»< Результат регистрации >>< Результат регистрации >>
Фактическое: <Экземпляр «Будущего< результата регистрации >»< Результат регистрации >>

Я ожидал, что фактическим результатом будет «Будущий< Результат регистрации >» < Результат регистрации>, а не «Будущий< Результат регистрации >» < Результат регистрации >.

Вот код:

 import 'package:equatable/equatable.dart';

import '../data/authentication_data_provider.dart';

abstract class SignUpResult {}

class SignUpResultSuccess extends Equatable implements SignUpResult {
  const SignUpResultSuccess();

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

class SignUpResultFailure extends Equatable implements SignUpResult {
  const SignUpResultFailure({String? errorCode}) : _errorCode = errorCode ?? '';

  final String _errorCode;

  String get errorCode => _errorCode;

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

class AuthenticationRepository {
  AuthenticationRepository({
    AuthenticationDataProvider? authenticationDataProvider,
  }) : _authenticationDataProvider =
            authenticationDataProvider ?? AuthenticationDataProvider();

  final AuthenticationDataProvider _authenticationDataProvider;

  Future<SignUpResult> signUp({
    required String email,
    required String password,
  }) async {
    try {
      await _authenticationDataProvider.createEmailAccount(
        email: email,
        password: password,
      );
      return const SignUpResultSuccess();
    } on CreateEmailAccountException catch (createEmailAccountException) {
      return SignUpResultFailure(
        errorCode: createEmailAccountException.errorCode,
      );
    } catch (e) {
      return const SignUpResultFailure();
    }
  }
}
 

А вот и тест:

 import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:pocket_open_access/app/features/authentication/data/authentication_data_provider.dart';
import 'package:pocket_open_access/app/features/authentication/repository/authentication_repository.dart';

class MockAuthenticationDataProvider extends Mock
    implements AuthenticationDataProvider {}

void main() {
  late AuthenticationRepository authenticationRepository;
  late AuthenticationDataProvider mockAuthenticationDataProvider;
  const String email = 'test@test.com';
  const String password = '1234567';

  setUp(
    () {
      mockAuthenticationDataProvider = MockAuthenticationDataProvider();
      authenticationRepository = AuthenticationRepository(
        authenticationDataProvider: mockAuthenticationDataProvider,
      );
    },
  );
  group(
    'Sign-up user:',
    () {
      test(
        'is successful so returns SignUpResultSuccess()',
        () {
          when(() => mockAuthenticationDataProvider.createEmailAccount(
                email: any(named: 'email'),
                password: any(named: 'password'),
              )).thenAnswer(
            (_) async {},
          );
          expect(
              authenticationRepository.signUp(email: email, password: password),
              Future.value(const SignUpResultSuccess()));
        },
      );
      test(
        'fails so returns SignUpResultFailure with error code',
        () {
          when(
            () => mockAuthenticationDataProvider.createEmailAccount(
              email: any(named: 'email'),
              password: any(named: 'password'),
            ),
          ).thenThrow(CreateEmailAccountException(errorCode: 'error-code'));
          expect(
              authenticationRepository.signUp(email: email, password: password),
              Future.value(const SignUpResultFailure(errorCode: 'error-code')));
        },
      );
    },
  );
}
 

Комментарии:

1. А Future может сравняться как равный только самому себе. Вы должны await Future и сравнить фактическое значение.

Ответ №1:

Спасибо @jamesdlin. Я использовал следующее, что теперь работает 🙂

       test(
        'is successful so returns SignUpResultSuccess()',
        () async {
          when(() => mockAuthenticationDataProvider.createEmailAccount(
                email: any(named: 'email'),
                password: any(named: 'password'),
              )).thenAnswer(
            (_) async {},
          );
          const SignUpResultSuccess expected = SignUpResultSuccess();
          final SignUpResult actual = await authenticationRepository.signUp(
              email: email, password: password);
          expect(actual, expected);
        },
      );