1

我有具有不同 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
        }

    }
}
4

2 回答 2

2

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)
于 2017-08-27T05:34:37.040 回答
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)
于 2017-08-27T08:50:06.843 回答