Moya 在存根和普通请求之间切换
Moya switch between stub and normal request
我有 NetworkManager class(在生产目标中)有不同的 n/w 请求。
如果我想提出生产请求,现在使用 Moya 我在下面使用
let provider = MoyaProvider<MyService>()
对于我在下面使用的 TestTarget 请求
let provider = MoyaProvider<MyService>(stubClosure: MoyaProvider.immediatelyStub)
因此,如果我想在如何为两者创建提供程序之间切换。什么是最好的方法。
在每种方法中检查目标 ?
或者其他有效的方法
下面是我的请求代码
func getRequest(onCompletion: @escaping NetworkCallBacks.ServiceResponse) {
//let provider = MoyaProvider<MyService>() //for production
let provider = MoyaProvider<MyService>(stubClosure: MoyaProvider.immediatelyStub) // for test
provider.request(.getList(queryParameter: “Apple”)) { result in
switch result {
case let .success(moyaResponse):
case let .failure(error):
break
}
}
}
为什么不在创建网络管理器或调用请求函数时传递一些 test
变量?我是这样做的:
extension Api.Service {
convenience init(test: Bool) {
self.init()
self.test = test
}
}
然后在获得提供商的同时,您可以懒惰地获得测试或产品提供商
func getProvider() -> RxMoyaProvider<Target> {
return RxMoyaProvider<Target>(stubClosure: stubClosure)
}
func stubClosure(_ target: Target) -> Moya.StubBehavior {
return test ? Moya.StubBehavior.immediate : Moya.StubBehavior.never
}
在您的情况下,您可以这样做:
func getRequest(onCompletion: @escaping NetworkCallBacks.ServiceResponse, test: Bool = false)
一种方法是创建具有 stubClosure
依赖关系的 NetworkManager
struct,这样您就可以在创建 NetworkManager 时在构造函数中传递 stubClosure。为 stubClosure 提供默认值 MoyaProvider.neverStub
,这样您就不必通过生产环境。只有当你想测试的时候你才能通过MoyaProvider.immediatelyStub
public struct NetworkingManager<T: TargetType> {
let provider: MoyaProvider<T>
init(stubClosure: @escaping MoyaProvider<T>.StubClosure = MoyaProvider.neverStub) {
self.provider = MoyaProvider<T>(stubClosure: stubClosure)
}
}
当你想测试时,你可以像下面这样传递 stubClosure
let networkManager = NetworkManager<MyService>(strubClosure: MoyaProvider.immediatelyStub)
我有 NetworkManager class(在生产目标中)有不同的 n/w 请求。 如果我想提出生产请求,现在使用 Moya 我在下面使用
let provider = MoyaProvider<MyService>()
对于我在下面使用的 TestTarget 请求
let provider = MoyaProvider<MyService>(stubClosure: MoyaProvider.immediatelyStub)
因此,如果我想在如何为两者创建提供程序之间切换。什么是最好的方法。 在每种方法中检查目标 ? 或者其他有效的方法
下面是我的请求代码
func getRequest(onCompletion: @escaping NetworkCallBacks.ServiceResponse) {
//let provider = MoyaProvider<MyService>() //for production
let provider = MoyaProvider<MyService>(stubClosure: MoyaProvider.immediatelyStub) // for test
provider.request(.getList(queryParameter: “Apple”)) { result in
switch result {
case let .success(moyaResponse):
case let .failure(error):
break
}
}
}
为什么不在创建网络管理器或调用请求函数时传递一些 test
变量?我是这样做的:
extension Api.Service {
convenience init(test: Bool) {
self.init()
self.test = test
}
}
然后在获得提供商的同时,您可以懒惰地获得测试或产品提供商
func getProvider() -> RxMoyaProvider<Target> {
return RxMoyaProvider<Target>(stubClosure: stubClosure)
}
func stubClosure(_ target: Target) -> Moya.StubBehavior {
return test ? Moya.StubBehavior.immediate : Moya.StubBehavior.never
}
在您的情况下,您可以这样做:
func getRequest(onCompletion: @escaping NetworkCallBacks.ServiceResponse, test: Bool = false)
一种方法是创建具有 stubClosure
依赖关系的 NetworkManager
struct,这样您就可以在创建 NetworkManager 时在构造函数中传递 stubClosure。为 stubClosure 提供默认值 MoyaProvider.neverStub
,这样您就不必通过生产环境。只有当你想测试的时候你才能通过MoyaProvider.immediatelyStub
public struct NetworkingManager<T: TargetType> {
let provider: MoyaProvider<T>
init(stubClosure: @escaping MoyaProvider<T>.StubClosure = MoyaProvider.neverStub) {
self.provider = MoyaProvider<T>(stubClosure: stubClosure)
}
}
当你想测试时,你可以像下面这样传递 stubClosure
let networkManager = NetworkManager<MyService>(strubClosure: MoyaProvider.immediatelyStub)