【问题标题】:Flutter testing, passing an actual HTTP client, instead of a mocked oneFlutter 测试,传递一个实际的 HTTP 客户端,而不是一个模拟的客户端
【发布时间】:2020-09-22 19:40:24
【问题描述】:

我在 Flutter 中开发了一个包,并想对其进行测试,它会进行网络调用。 我们知道测试时所有的网络请求都会返回 404,这样的 HTTP 请求需要被模拟。 但是,也可以使用原始 HTTP 客户端而不是模拟或获取 404。 https://github.com/flutter/flutter/issues/19086#issuecomment-402639134

我们如何做到这一点?

我已经试过了:


main(){
  TestWidgetsFlutterBinding.ensureInitialized();
  HttpOverrides.runZoned(() {
    test("Case1: Make HTTP request to an actual server", ()async{
      let a = MyPackage.makesAHTTPRequest();
       expect(a,"hello world"); 
    });

  }, createHttpClient: (SecurityContext c) => new HttpClient(context: c));

}

我的网址一切正常。 但它一直给我 404。

如果需要,如何使用真正的 HTTP 客户端?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    好的,如果有人像我一样面临类似的问题,请使用此 hack。

    您需要修改您的类,以便我们可以在运行时将 HTTP 客户端注入其中。我们将需要修改我们的测试用例。

    import 'package:http/http.dart'; //client is from this pack
    Client httpclinet = Client();
    var a = MyPackage.makesAHTTPRequest(httpclient);
    

    删除 Httpoverride.runzoned cod,您可以直接从 http 包中传递 Client 对象。 由于虚假的异步效果,某些测试用例会失败,但您可以使用超时来管理这些。

    您还需要删除任何此类声明: TestWidgetsFlutterBinding.ensureInitialized();

    在我的情况下,我在从资产加载文件时添加了这一行,使用包表示法,我在本地引用它们并在 ensureInitalized 行上方删除。 [实际上我在测试期间通过标志使用本地符号,否则使用封装符号]

    【讨论】:

      猜你喜欢
      • 2021-09-27
      • 1970-01-01
      • 2011-06-13
      • 2012-08-09
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2013-09-03
      • 2016-09-28
      相关资源
      最近更新 更多