当我运行应用程序时,Alamofire响应块没有问题。当运行测试并使用OHHTTPStubs模拟响应时,两个存根块(请求和响应)都会被调用,但Alamofire响应块永远不会被调用,因此测试失败。用URLRequest尝试了完全相同的存根,响应块被称为没有问题。
Api类:
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)
}测试:
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,而是这样做,信号量就会到达,没有问题:
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 {
}发布于 2018-06-06 22:15:29
不确定你在什么地方给Api.instance打过电话。但是您似乎没有使用Api类的共享实例,而是初始化了private init()方法中的所有内容。
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)
}
}测试应该是
func test() {
...
Api.shard.requestFunction(path, { (_, _) in
semaphore.signal()
})
...
}https://stackoverflow.com/questions/50722186
复制相似问题