Moya在存根和正常请求之间切换

时间:2017-08-27 04:47:32

标签: ios swift moya

我有不同的n / w请求的NetworkManager类(在生产目标中)。 现在使用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
        }

    }
}

2 个答案:

答案 0 :(得分:2)

一种方法是创建具有NetworkManager依赖关系的stubClosure结构,这样您就可以在创建NetworkManager时在构造函数中传递stubClos​​ure。为stubClos​​ure提供默认值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)
    }
}

当你想测试时,你可以传递stubClos​​ure,如下所示

let networkManager = NetworkManager<MyService>(strubClosure: MoyaProvider.immediatelyStub)

答案 1 :(得分:1)

为什么在创建网络管理器或调用请求函数时没有传递一些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)