gpt4 book ai didi

siesta-swift - 如何模拟资源响应?

转载 作者:行者123 更新时间:2023-12-05 00:17:36 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个封装 Service 的类并具有返回资源和请求的方法。在我的测试中,我想在不进行任何实际网络调用的情况下模拟请求和资源的成功/失败。因为 Request是一个协议(protocol),通过返回一个只调用 onSuccess 的自定义实现很容易做到这一点, onFailure等等

但是,对于返回 Resource 的方法来说,这并不是那么简单。 , 自 Resource是最终类而不是协议(protocol)。我想创建一个模拟 Resource load() 时不执行任何实际网络请求etc 被调用,并公开了一些方法来伪造成功/失败,从而触发添加到 Resource 的观察者。 .目前有没有办法做到这一点?

最佳答案

你有几个选择:

stub NetworkingProvider
使用自定义 NetworkingProvider 创建您的服务执行。

// App

var myAppNetworkingProvider: NetworkingProviderConvertible =
URLSessionConfiguration.ephemeral // Siesta default
...
Service(baseURL: "...", networking: myAppNetworkingProvider)

// Tests

myAppNetworkingProvider = NetworkStub()

您的 StubbedNetworkingProvider可以返回单个硬编码 URLResponse , 或匹配 URLRequest如果您想一次 stub 多个响应。

这是大多数应用程序的最佳选择。您可以在 Siesta’s own performance tests 中看到它的示例.它简单、快速并提供细粒度的控制,但仍可让您使用真实的 Siesta 行为进行测试。

stub 网络

Siesta 使用网络 stub 库,如 OHHTTPStubs , Mockingjay , 和 Nocilla . (Siesta 本身使用 Nocilla 进行自己的内部回归测试,尽管该库有内部竞争条件并且在撰写本文时维护得不是特别好,所以我不能全心推荐它。)

stub 网络本身具有测试应用程序与底层网络 API 的完整交互的优势。这种方法可能最适合全面的集成测试,特别是如果您想记录和重放来自真实 API 的响应。

自定义资源协议(protocol)

因为 Swift 支持 retroactive modeling , Resource不需要是(或实现)可测试的协议(protocol)。您可以创建自己的一个:
protocol ResourceProtocol {
// Resource methods your app uses
}

// No new methods; just adding conformance
extension Resource: ResourceProtocol { }

这听起来最像您在原始问题中寻找的内容。但是,我并不特别推荐它:
  • 它实现起来最复杂,也最容易出错。你会发现准确模仿 Siesta 的所有行为非常困难。相信我:Resource API 一开始似乎很无辜,但如果你尝试以这种方式锻炼整个应用程序,你会发现自己重新实现了一半的库。
  • 它很可能会遗漏问题而不会发现回归。使用 Siesta 的许多危险点都与调用的确切顺序有关:哪些事件发生以及以什么顺序发生,立即发生的事情与主运行循环的后续轮次发生的事情,观察者/所有者关系做什么或不做什么创建保留周期等。您必须对所有这些事情做出假设,并且您最终将根据您的假设测试您的代码 - 而不是针对库的真实行为。

  • 简而言之,与其他方法相比,它付出了更高的努力,值(value)更低。这当然不是进行回归测试的有效方法。

    也就是说,如果您坚持纯粹的“不要测试超出边界”的单元测试理念,那么这就是这样做的方法。

    关于siesta-swift - 如何模拟资源响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39827137/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com