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

Posted

技术标签:

【中文标题】Moya 在存根和正常请求之间切换【英文标题】:Moya switch between stub and normal request 【发布时间】:2017-08-27 04:47:32 【问题描述】:

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

    

【问题讨论】:

【参考方案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)

【讨论】:

【参考方案2】:

一种方法是使用stubClosure 依赖创建NetworkManagerstruct,这样您就可以在创建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)

【讨论】:

以上是关于Moya 在存根和正常请求之间切换的主要内容,如果未能解决你的问题,请参考以下文章

在 Moya 14 中记录响应和请求

RxSwift 和 Moya 同步请求

为 Moya 请求编写单元测试

Moya/Alamofire 请求变量问题

使用 moya 和 alamofire 时使用参数编码发布请求错误

Swift网络请求(Moya篇)