如何嘲笑河荚的读者?



我有下面的存储库,我想测试一下。我知道这可能是一个愚蠢的问题,但我仍在学习。

class AuthRepository implements AuthBaseRepository {
final Reader _read;
const AuthRepository(this._read);
@override
Future<User> login({String email, String password}) async {
try {
final response = await _read(dioProvider).post(
'/sign_in',
data: {
"user": {
"email": email,
"password": password,
},
},
);
return _mapUserFromResponse(response);
} on DioError catch (_) {
throw const CustomException(message: 'Invalid login credentials.');
} on SocketException catch (_) {
const message = 'Please check your connection.';
throw const CustomException(message: message);
}
}

这就是我迄今为止所做的:


void main() {
test('loadUser', () async {
Dio dio;
DioAdapterMockito dioAdapterMockito;
AuthRepository repository;
setUpAll(() {
dio = Dio();
dioAdapterMockito = DioAdapterMockito();
dio.httpClientAdapter = dioAdapterMockito;
repository = AuthRepository(_reader_here_);
});
test('mocks any request/response via fetch method', () async {
final responsePayload =
await parseJsonFromAssets("assets/api-response.json");
final responseBody = ResponseBody.fromString(
responsePayload,
200,
headers: {
Headers.contentTypeHeader: [Headers.jsonContentType],
},
);
when(dioAdapterMockito.fetch(any, any, any))
.thenAnswer((_) async => responseBody);
});
});
}

我不知道如何嘲笑读者。基本上,我见过类似class MyMock extends Mock implements Something的东西,但Reader不是一个类,它是一个函数,所以我完全迷失了方向。

任何帮助/提示/示例都将不胜感激。

提前感谢!

与其尝试模拟Reader,不如为您的存储库创建一个提供程序,并使用ProviderContainer读取它。

class AuthRepository implements AuthBaseRepository {
const AuthRepository(this._read);
static final provider = Provider<AuthRepository>((ref) => AuthRepository(ref.read));
final Reader _read;
@override
Future<User> login({String email, String password}) async {
...
}

示例用法:

final user = createTestUser();
final container = ProviderContainer(
overrides: [
// Example of how you can mock providers
dio.overrideWithProvider(mockDio),
],
);
final repo = container.read(AuthRepository.provider);
expectLater(
await repo.login(email: 'AzureDiamond', password: 'hunter2'),
user,
);

您还可以考虑使用ProviderContainer中的重写来模拟Dio,而不是使用模拟框架来进一步简化测试。

点击此处了解更多测试信息。

最新更新