不能调用非函数类型的值,swift + cuckoo mocking framework
Cannot call value of non-function type, swift + cuckoo mocking framework
我正在尝试在 swift 中使用布谷鸟模拟服务。这是服务中的原始功能:
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)行收到编译器抱怨:
Cannot call value of non-function type '(ErrorCoordinatorDelegate, (()
-> Void)?, MockEndPointServiceType.GetAppConfigCompletionHandler)' (aka '(ErrorCoordinatorDelegate, Optional<(() -> ())>, (AppConfig) ->
())')
我错过了什么?
错误消息虽然有点复杂,但可以准确告诉您问题所在;
当您调用 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)
}
}
哪个更标准,也不那么晦涩:)
我正在尝试在 swift 中使用布谷鸟模拟服务。这是服务中的原始功能:
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)行收到编译器抱怨:
Cannot call value of non-function type '(ErrorCoordinatorDelegate, (() -> Void)?, MockEndPointServiceType.GetAppConfigCompletionHandler)' (aka '(ErrorCoordinatorDelegate, Optional<(() -> ())>, (AppConfig) -> ())')
我错过了什么?
错误消息虽然有点复杂,但可以准确告诉您问题所在;
当您调用 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)
}
}
哪个更标准,也不那么晦涩:)