【问题标题】:Flutter how to mock function response when it is called in tested functionFlutter如何在测试函数中调用函数响应时模拟函数响应
【发布时间】:2021-04-18 15:56:19
【问题描述】:

我正在尝试测试一些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');
    }
  }

两个功能:

retrieveToken();
getApiEndpoint();

内部调用的函数与 getType() 函数不是同一类的成员。它们还包含 在它们里面有 FlutterSecureStorage() 的实例。

我不需要测试这个函数,我只是想在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);
    });
}

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

MissingPluginException(未找到在通道 plugins.it_nomads.com/flutter_secure_storage 上读取方法的实现)

我会非常感谢任何提示如何处理这个主题以及我在这个主题上做错了什么。我是 Flutter 单元测试的新手,我试图在网络上找到任何与我类似的问题,但不幸的是失败了。

【问题讨论】:

    标签: flutter unit-testing dart testing mocking


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多