higan96技術メモ

https://github.com/higan96

OHHTTPStubとXCTestで、モックを使った非同期処理をテストする

通信をモックを使って、実際のサーバーサイドやWebAPIとの通信を行わずにテストする。

import UIKit
import XCTest

class SomeAPIClientTests: XCTestCase {
    let someAPIClient = SomeAPIClient()

    override func setUp() {
        super.setUp()
    }
    
    override func tearDown() {
        super.tearDown()
    }

    func testExample(){
        let obj = SomeObject()
        let stub:NSDictionary = ["id": 1]
        let expectation = self.expectationWithDescription("非同期通信は完了する")
        let stubDesc = OHHTTPStubs.stubRequestsPassingTest({ (request: NSURLRequest!) -> Bool in
            // 通信処理をモックを通して行なうか、の条件。trueを返すときに、モックを通す
            return true
            }, withStubResponse:( { (request: NSURLRequest!) -> OHHTTPStubsResponse in
                //レスポンス
                //失敗させたいときはステータスコードをいじるなどする
                return OHHTTPStubsResponse(JSONObject: stub, statusCode: 200, headers: ["Content-Type" : "text/json"])
            })
        )
        
        someAPIClient.post(obj, callback: {(postedObj, error) -> () in
            XCTAssertNil(error, "Error should be nil.")
            //通信が正常に行われたこと、失敗したことをテストしても意味がないので、実際にはそれぞれのケースで行われる処理をテストする。
            //expectation.fulfill()が呼ばれたことが、このテストの非同期処理が正常に行われたことを意味する。
            expectation.fulfill()
        })
        
        self.waitForExpectationsWithTimeout(5, handler: {(error) -> Void in
            //expectation.fulfill()が呼ばれたタイミングで実行される。
            //ここでOHHTTPStubsを消しておかないと、
            //他のテストの通信もこのテストの設定のモックが使用されてしまう。
            OHHTTPStubs.removeAllStubs()
            return
        })
    }
}