Flutter 颤振在测试函数中调用时如何模拟函数响应

Flutter 颤振在测试函数中调用时如何模拟函数响应,flutter,unit-testing,dart,testing,mocking,Flutter,Unit Testing,Dart,Testing,Mocking,我正在尝试测试一些api调用函数: Future<SomeType> getType(int id) async { String token = await retrieveToken(); String api = await getApiEndpoint(); final response = await client.get("$api/something/$id", headers: { "Authorization

我正在尝试测试一些api调用函数:

  Future<SomeType> getType(int id) async {
    String token = await retrieveToken();
    String api = await getApiEndpoint();
    final response = await client.get("$api/something/$id", headers: { "Authorization": "Bearer $token"});
    if (response.statusCode == 200) {
      String body = utf8.decode(response.bodyBytes);
      return SomeType.fromJson(json.decode(body));
    } else {
      throw Exception('Failed to load some types from API');
    }
  }
内部调用的不是与getType()函数属于同一类的成员。它们还包含 在它们内部是SecureStorage()的实例

我不需要测试这个函数,我只想在测试getType函数时模拟它们的响应

我创建了以下测试示例:

class MockedApiEndpoint extends Mock implements ApiEndpoint {}
void main() {
    WidgetsFlutterBinding.ensureInitialized();
    test('returns SomeType', () async {
      final typesRepository = TypesRepository();
      final mockedApiEndpoint = MockedApiEndpoint();

      when(mockedApiEndpoint.getApiEndpoint()).thenAnswer((_) async => Future.value("some_url.com"));
      when(mockedApiEndpoint.retrieveToken()).thenAnswer((_) async => Future.value("some_token"));

      typesRepository.client = MockClient( (request) async {
        final mapJson = {'id' : 123};
        return Response(json.encode(mapJson), 200);
      });

      final type =  await typesRepository.getType(123);
      expect(type.id, 123);
    });
}

我成功地模拟了客户端的响应,我也尝试模拟这两个函数的响应,但我不断收到以下错误:

缺少PluginException(在channel plugins.it\u nomads.com/flatter\u secure\u storage上未找到读取方法的实现)


我将非常感谢任何关于如何处理这个话题以及我在这个问题上做错了什么的提示。我不熟悉颤振中的单元测试,我曾尝试在web上找到与我类似的问题,但不幸失败。

ApiEndPoint类必须作为依赖项传递给TypesRepository类。然后在测试中,您在构造函数中通过实例化的mock,否则dart不知道您正在使用正在生成的mock引用哪个实例,这就是它返回的错误

class TypesRepository{
  final ApiEndpoint apiEndpoint;

  TypesRepository(this.apiEndpoint);
...
}
class TypesRepository{
  final ApiEndpoint apiEndpoint;

  TypesRepository(this.apiEndpoint);
...
}
class MockedApiEndpoint extends Mock implements ApiEndpoint {}
void main() {
    WidgetsFlutterBinding.ensureInitialized();
    test('returns SomeType', () async {
      final ApiEndPoint mockedApiEndpoint = MockedApiEndpoint();
      final typesRepository = TypesRepository(mockedApiEndpoint);

      when(mockedApiEndpoint.getApiEndpoint()).thenAnswer((_) async => "some_url.com");
      when(mockedApiEndpoint.retrieveToken()).thenAnswer((_) async => ("some_token");

      typesRepository.client = MockClient( (request) async {
        final mapJson = {'id' : 123};
        return Response(json.encode(mapJson), 200);
      });

      final type =  await typesRepository.getType(123);
      expect(type.id, 123);
    });
}