您有幾種選擇:
的Stub NetworkingProvider
與自定義NetworkingProvider
實現創建您的服務。
// App
var myAppNetworkingProvider: NetworkingProviderConvertible =
URLSessionConfiguration.ephemeral // Siesta default
...
Service(baseURL: "...", networking: myAppNetworkingProvider)
// Tests
myAppNetworkingProvider = NetworkStub()
你StubbedNetworkingProvider
可以返回一個硬編碼的URLRequest
,或匹配,如果你想一次存根多個響應。
這是大多數應用程序的最佳選擇。你可以在Siesta’s own performance tests中看到它的一個例子。它簡單,快速,並提供細緻的控制,但仍然可以讓您用真實的Siesta行爲進行測試。
存根網絡
午睡可與像OHHTTPStubs,Mockingjay和Nocilla網絡磕碰庫。 (Siesta本身使用Nocilla進行自己的內部迴歸測試,雖然庫本身具有內部競爭條件,並且在撰寫本文時沒有特別好的維護,所以我不能全心全意地推薦它。)
對網絡本身進行存根擁有測試您的應用與底層網絡API的完整交互的優勢。這種方法對於全集成測試可能是最好的,特別是如果你想記錄和重放來自真實API的響應。
自定義資源協議
由於夫特支持retroactive modeling,Resource
不需要是(或實施)一個可測試協議。你可以創建一個你自己的:
protocol ResourceProtocol {
// Resource methods your app uses
}
// No new methods; just adding conformance
extension Resource: ResourceProtocol { }
這聽起來最像你在你的原始問題中尋找什麼。不過,我並不特別推薦它:
- 這是最複雜的實施 - 和最容易出錯。你會發現準確地模擬Siesta的所有行爲令人驚訝地很難。相信我:資源API起初似乎很清白,但如果您嘗試以這種方式來運用您的整個應用程序,您會發現自己重新實現了一半的庫。
- 這很可能會漏掉問題,而不是迴歸。使用Siesta的許多危險地點必須處理確切的調用順序:哪些事件發生,以什麼順序發生,立即發生什麼,以及主循環的後續轉向,觀察者/所有者關係是做什麼或不做什麼創建保留週期等。您必須對所有這些事情做出假設,然後最終根據您的假設測試代碼 - 而不是違背圖書館的真實行爲。
總之,與其他方法相比,更低的價值努力。這當然不是進行迴歸測試的有效方法。這就是說,如果你堅持一個純粹主義者「不要超越界限」單元測試哲學,那麼這就是做這件事的方法。