Получение Alamofire и OHHTTPS труб Работа вместе
Я пытаюсь настроить OHHTTPStubs для работы с Alamofire для моих модульных тестов, но они всегда загружаются из действующей сети при использовании Alamofire. Я отключил использование хост-приложения в тестовой цели и убедился, что OHHTTPStubs используется первым.
Вот пример теста, в котором результаты, загруженные с Alamofire, получены из действующей сети:
import XCTest
import OHHTTPStubs
import Alamofire
@testable import TestAlamoFireStubs
class TestAlamoFireStubsTests: XCTestCase {
let responseText = "{'data':'val'}"
override func setUp() {
super.setUp()
stub(isHost("httpbin.org")) {request -> OHHTTPStubsResponse in
let stubData = self.responseText.dataUsingEncoding(NSUTF8StringEncoding)
return OHHTTPStubsResponse(data:stubData!, statusCode:200, headers:nil)
}
}
func testNSURLSession(){
let expectation = expectationWithDescription("Check NSURLSession")
let url = NSURL(string:"https://httpbin.org/get")
let dataTask = NSURLSession.sharedSession().dataTaskWithURL(url!){ data, response, error in
let responseString = NSString(data:data!, encoding:NSUTF8StringEncoding) as? String
XCTAssertEqual(responseString, self.responseText) // succeeds
expectation.fulfill()
}
dataTask.resume()
waitForExpectationsWithTimeout(10, handler:nil)
}
func testAlamofire() {
let expectation = expectationWithDescription("Check Alamofire")
Alamofire.request(.GET, "https://httpbin.org/get").response{ request, response, data, error in
let responseString = NSString(data:data!, encoding:NSUTF8StringEncoding) as? String
XCTAssertEqual(responseString, self.responseText) // fails
expectation.fulfill()
}
waitForExpectationsWithTimeout(10, handler:nil)
}
}
И ссылка на пример проекта: https://www.dropbox.com/s/b0qdvjpk8t6r525/TestAlamoFireStubs.zip
3 ответа
По крайней мере, в моем конкретном случае мне удалось связать Alamofire с OHHTTPStubs, создав собственный менеджер с пользовательским NSURLSession и конфигурацией
import XCTest
import Alamofire
import OHHTTPStubs
@testable import AlamofireOHHTTPStubs
class AlamofireOHHTTPStubsTests: XCTestCase {
let manager: Manager = {
let configuration = NSURLSession.sharedSession().configuration
//The most important string!
OHHTTPStubs.setEnabled(true, forSessionConfiguration: configuration)
configuration.URLCache = nil
let delegate = Manager.SessionDelegate()
let session = NSURLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)
return Manager(session: session, delegate: delegate)!
}()
let responseText = "{\"data\":\"val\"}"
func testAlamofireOHHTTPStubs() {
stub(isHost("httpbin.org")) { request -> OHHTTPStubsResponse in
let stubData = self.responseText.dataUsingEncoding(NSUTF8StringEncoding)
return OHHTTPStubsResponse(data:stubData!, statusCode:200, headers:nil)
}
let expectation = expectationWithDescription("alamofire request expectation")
manager.request(.GET, "https://httpbin.org/get").responseJSON { (response) in
switch response.result {
case .Success(let json as NSDictionary):
XCTAssertEqual(json["data"] as? String, "val")
default:
XCTFail()
}
expectation.fulfill()
}
waitForExpectationsWithTimeout(1.0, handler: nil)
}
}
Для меня проблема была в том, что мой Подфайл отсутствовал pod 'OHHTTPStubs'
Я имел только pod 'OHHTTPStubs/Swift'
там. Правильный подфайл должен выглядеть так:
pod 'OHHTTPStubs' # This one required!!
pod 'OHHTTPStubs/Swift' # This one optional
Все это задокументировано в README OHTTPStubs.
Если кому-то интересно, как настроить собственный менеджер в Alamofire 4 и Swift 3, вот решение:
let sessionManager: SessionManager
init() {
let configuration = URLSessionConfiguration.default
OHHTTPStubs.setEnabled(true, for: configuration)
configuration.urlCache = nil
sessionManager = SessionManager(configuration: configuration)
}