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