【问题标题】:How do I mock network requests in Xcode UI tests while the tests are running?如何在测试运行时在 Xcode UI 测试中模拟网络请求?
【发布时间】:2016-08-14 14:41:51
【问题描述】:

我们有一套使用 KIF 编写的应用的 UI 测试,我想将其转换为使用新的 Xcode UI 测试框架。

该应用程序是 Rest AI 的客户端,我们目前正在模拟其响应,方法是使用 NSURLProtocol 提供预定义的 JSON 文件以响应 GET、POST、PUT 等...所有测试均使用这些文件,所以我想继续使用它们。服务器上的相同端点在测试的不同点返回不同的数据,所以我不能预先模拟它们,我需要能够在测试运行时调用一个方法来模拟服务器的下一个响应。

不幸的是,在 Xcode UI 测试中使用 NSURLProtocol 不会影响被测试的应用程序,而且我只看到了通过启动参数或环境向应用程序发送数据的方法,例如在 this answer 中。我需要在测试期间的不同阶段以不同的方式模拟它们。如何以在测试期间更改的方式从 UI 测试内部模拟网络请求?或者我如何与正在测试的应用程序进行通信,以便我可以让它模拟请求本身?

【问题讨论】:

    标签: ios xcode-ui-testing


    【解决方案1】:

    我们在纯 Swift 中开发了一个嵌入式 HTTP 服务器,您可以在测试用例中使用简单的模拟响应处理程序运行 HTTP 服务器,然后通过环境变量(如 API_BASE_URL)将 URL 传递给目标应用程序。我写了一篇关于如何做的文章

    Embedded web server for iOS UI testing

    基本上有两个库,一个是Embassy,它是简单的异步HTTP服务器。另一个是Ambassador,一个用于模拟 API 端点的简单 Web 框架。

    【讨论】:

      【解决方案2】:

      我们在尝试从 KIF 迁移到 UI 测试时遇到了完全相同的问题。为了克服 UI 测试在存根和模拟方面的限制,我们使用在应用程序上实例化的 Web 服务器在应用程序和测试代码之间建立了一个自定义链接。测试代码向应用程序发送 HTTP 请求,这些请求可以方便地转换为存根请求 (OHHTPStub)、NSUserDefault 更新、向应用程序上传/下载项目。当您需要检查特定端点是否被调用时,甚至可以开始监控网络调用。如果您觉得缺少某些东西,添加新功能应该相当简单。

      使用该库非常简单,请查看我们的github repo

      【讨论】:

      • 我们遇到了完全相同的问题,并开发了一个嵌入式 HTTP 服务器来解决它。请参考我的回答:P
      【解决方案3】:

      您可以使用 OHHTTPStubs 模拟它们,也可以编写自己的存根。

      简而言之,您应该使用 NSURLSession 子类来存根请求,并将存根的 NSURLSession 注入您的网络层。 launchEnvironment 属性可能有助于将模拟的 url 传递给测试。

      【讨论】:

      • OHHTTPStubs 和 NSURLSession 对我没有用,因为我的测试在与我希望测试的应用不同的应用中运行。 launchEnvironment 属性对我没有用,因为我无法在测试中更改它。
      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      相关资源
      最近更新 更多