我正在嘗試用布谷鳥快速模擬一項服務。這是服務中的原始功能:
typealias GetAppConfigCompletionHandler = (_ response: AppConfig) -> Void
func getAppConfig(delegate: ErrorCoordinatorDelegate,
retryClosure: (() -> Void)?,
response responseCallback: @escaping GetAppConfigCompletionHandler) {
guard let appConfigUrl = "some/url"
HttpClientService<AppConfig>.makeRequest(errorCoordinatorDelegate: delegate,
retryClosure: retryClosure,
url: appConfigUrl) { appConfig in
responseCallback(appConfig)
}
}
然后在測驗中,我試圖模擬 EndPointService 以使其回呼我的模擬值而不是呼叫 API:
guard let mockedAppConfig: AppConfig = JsonTestingHelper.decodeJSON(resourceName: "mockAppConfig",
model: AppConfig.self) else {
fail("failed to create mockAppConfig from JSON")
return
}
stub(endPointServiceMock) { mock in
when(mock.getAppConfig(delegate: any(),
retryClosure: any(),
response: any())).then { callback in
callback(mockedAppConfig) //error is here
}
}
這就是生成的模擬函式的樣子:
func getAppConfig(delegate: ErrorCoordinatorDelegate, retryClosure: (() -> Void)?, response responseCallback: @escaping GetAppConfigCompletionHandler) {
return cuckoo_manager.call("getAppConfig(delegate: ErrorCoordinatorDelegate, retryClosure: (() -> Void)?, response: @escaping GetAppConfigCompletionHandler)",
parameters: (delegate, retryClosure, responseCallback),
escapingParameters: (delegate, retryClosure, responseCallback),
superclassCall:
Cuckoo.MockManager.crashOnProtocolSuperclassCall()
,
defaultCall: __defaultImplStub!.getAppConfig(delegate: delegate, retryClosure: retryClosure, response: responseCallback))
}
從它看起來應該可以作業,但是我得到編譯器在回呼(mockedAppConfig)行抱怨:
不能呼叫非函式型別的值'(ErrorCoordinatorDelegate, (() -> Void)?, MockEndPointServiceType.GetAppConfigCompletionHandler)' (aka '(ErrorCoordinatorDelegate, Optional<(() -> ())>, (AppConfig) -> ( ))')
我錯過了什么?
uj5u.com熱心網友回復:
錯誤訊息雖然有點復雜,但可以準確地告訴您問題所在;
當您呼叫 時callback(mockedAppConfig),您的callback變數實際上是一個具有 3 個引數的元組(一個ErrorCoordinatorDelegate、一個可選Void函式和一個接受AppConfig引數的函式)。
為了修復此錯誤,您需要做的就是:
callback.2(mockedAppConfig)
(這是您參考元組的任何未命名引數的方式)
或者,更好的是,你可以讓你的存根看起來像這樣:
stub(endPointServiceMock) { mock in
when(mock.getAppConfig(delegate: any(),
retryClosure: any(),
response: any())).then { _, _, callback in
callback(mockedAppConfig)
}
}
哪個更標準,更不晦澀:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/406787.html
標籤:
上一篇:如何測驗更新方法?
