首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用OHHTTPStubs模拟时未到达Alamofire响应块

使用OHHTTPStubs模拟时未到达Alamofire响应块
EN

Stack Overflow用户
提问于 2018-06-06 21:51:36
回答 1查看 299关注 0票数 0

当我运行应用程序时,Alamofire响应块没有问题。当运行测试并使用OHHTTPStubs模拟响应时,两个存根块(请求和响应)都会被调用,但Alamofire响应块永远不会被调用,因此测试失败。用URLRequest尝试了完全相同的存根,响应块被称为没有问题。

Api类:

代码语言:javascript
复制
private static var config: URLSessionConfiguration?
private static var session: SessionManager?

static var instance = getInstance()

private static func getInstance() -> Api {
    let api = self.init()
    return api
}

private init() {
    Api.config = URLSession.shared.configuration
    var headers = SessionManager.defaultHTTPHeaders
    headers.removeValue(forKey: "User-Agent")
    headers["User-Agent"] = APP_VERSION
    Api.config?.httpAdditionalHeaders = headers
    Api.session = SessionManager(configuration: Api.config!)
}

func requestFunction(_ path: String) {
    let req = Api.session!.request("\(apiUrl())\(path)", method: .get, parameters: request.toJSON()).response(completionHandler: completionHandler)
}

测试:

代码语言:javascript
复制
func test() {
    stub(condition: { (request) -> Bool in
            return true
        }) { (request) -> OHHTTPStubsResponse in
            return OHHTTPStubsResponse(
                jsonObject: self.usageResponse,
                statusCode: 200,
                headers: ["Content-Type":"application/json"]
            )
        }

    let semaphore = DispatchSemaphore.init(value: 0)
    Api.instance.requestFunction(path, { (_, _) in
        semaphore.signal()
    })

    let timeout = DispatchTime.now() + DispatchTimeInterval.seconds(300)
    if semaphore.wait(timeout: timeout) == DispatchTimeoutResult.timedOut {
        XCTFail("semaphore not reached")
    }
}

信号量永远不会到达。但是,如果不是调用Alamofire,而是这样做,信号量就会到达,没有问题:

代码语言:javascript
复制
    do {
        let request = try URLRequest.init(url: "www.w.com", method: .post)
        let configuration = URLSessionConfiguration.default
        let session = URLSession(configuration: configuration)
        let task = session.dataTask(with: request) { (_, _, _) in
            semaphore.signal()
        }
        task.resume()
    } catch {

    }
EN

回答 1

Stack Overflow用户

发布于 2018-06-06 22:15:29

不确定你在什么地方给Api.instance打过电话。但是您似乎没有使用Api类的共享实例,而是初始化了private init()方法中的所有内容。

代码语言:javascript
复制
class Api {
    private var config: URLSessionConfiguration?
    private var session: SessionManager?

    static let shared = Api()

    private init() {
        config = URLSession.shared.configuration
        var headers = SessionManager.defaultHTTPHeaders
        headers.removeValue(forKey: "User-Agent")
        headers["User-Agent"] = APP_VERSION
        config?.httpAdditionalHeaders = headers
        session = SessionManager(configuration: Api.config!)
    }

    func requestFunction(_ path: String) {
        let req = session!.request("\(apiUrl())\(path)", method: .get, parameters: request.toJSON()).response(completionHandler: completionHandler)
    }
}

测试应该是

代码语言:javascript
复制
func test() {
    ...

    Api.shard.requestFunction(path, { (_, _) in
        semaphore.signal()
    })

    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50722186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档