LoginSignup
42
41

More than 5 years have passed since last update.

HTTPスタブを簡単に実装できるライブラリを書いてみました

Posted at

アプリを作っていて、サーバーサイドのAPIが未完成な状態で、クライアントサイドの実装を進めたいことってよくあると思います。あるある!

レスポンスの形式はなんとなく決まってるけど、APIできてないし困ったなーという時、想定されれるレスポンスをアプリのローカルで偽装できるライブラリを作ってみました。

Github - yukiasai/Kagee

はじめに

まず最初に強調しておきたいことは、このライブラリはHTTPリクエストに対するレスポンスを偽装するということです。
ローカルで偽装するため、どこかにサーバーを立てる必要もなく、簡単にスタブの実装を埋め込むことが出来ます。

使い方

アプリケーションが起動した時、MockProtocol.register()を呼び出し、擬装用のプロトコルを起動します。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    MockProtocol.register()
    return true
}

その後、HTTPリクエストに対するレスポンスをどんどん定義していきましょう。

Mock.install().request(url: "/").response(200, body: nil, header: nil)

上記の例は

/ というパスにGETリクエストを送信した際、ステータスコードが200のレスポンスが返ってくるよ

という意味になります。もちろんPOST,PUT,DELETEも定義出来ますし、BodyHeaderの定義、400500のエラーも定義できます。

通信の処理は普段通りNSURLSessionAlamofireで実装しましょう。

NSURLSession

let request = NSURLRequest(URL: NSURL(string: "/")!)
let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
session.dataTaskWithRequest(request) { data, response, error in
    let httpResponse = response as! NSHTTPURLResponse
    // Status code is 200 !!!
    ex.fulfill()
}.resume()

Alamofire

Alamofire.request(.GET, "/").response { _, response, _, _ in
    // Status code is 200 !!!
}

Body

レスポンスBodyの種類は以下をサポートしています

  • JSON
  • File
  • Text (String)
  • NSData

例えばJSON、Fileだと下記のように記述します。

JSON

[String: AnyObject]をレスポンスとして返します。

let json: [String: AnyObject] = ["name": "yukiasai", "age": 28]
Mock.install().request(url: someUrl).response(200, body: JSON(json), header: nil)

File

Bundleなどに存在するファイルの中身をレスポンスとして返します。

let fileUrl: NSURL = NSURL(string: "path/to/file")!
Mock.install().request(url: someUrl).response(200, body: File(fileUrl), header: nil)

また、レスポンスを動的に生成するハンドラを定義することも可能です。

Mock.install().request(url: someUrl).response { request -> Response in
    let response = NSHTTPURLResponse(URL: request.URL!, statusCode: 200, HTTPVersion: nil, headerFields: nil)!
    let data = "12345".dataUsingEncoding(NSUTF8StringEncoding)
    return .Success(response, data)
    // or return .Failure(error)
}

Speed

通信状態を定義することでレスポンスのスピードを変えることが出来ます。

Mock.install().request(url: url)
    .response(200, body: File(fileUrl), header: nil)
    .speed(.Wifi)

サポートされたスピードは以下のとおりです。

public enum Speed {
    case Prompt
    case Wifi      // 45Mbps
    case Mobile4G  // 10Mbps
    case Mobile3G  // 1Mbps
    case Edge      // 200kbps
    case Custom(bps: Double)   // Custom speed
}

終わりに

ぜひ使ってみてください!

42
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
41