json を読み込んで ObjectMapper のクラスのテストを書く


ObjectMapper は Swift の Json Parser の1つです。
Mappable を継承して Entity Object を作る事ができます。

import ObjectMapper

class User: Mappable {
    var id: Int = 0
    var familyName: String = ""
    var givenName: String = ""

    required init?(map: Map) { }

    func mapping(map: Map) {
        id <- map["id"]
        familyName <- map["family_name"]
        givenName <- map["given_name"]
    }
}

extension User {
    public var fullName: String {
        return familyName + " " + givenName
    }
}

このクラスのテストを書くときに、 User のデータを JSON ファイルから読み込んでテストができるようにしていきます。

JSON ファイルの準備

User.json というファイル名で JSON を作成します。

{
    "id": 1,
    "family_name": "苗字",
    "given_name": "名前"
}

JSON の読み込み方法

まず User.json のファイルを読み込みます。

let url = Bundle(for: type(of: self)).url(forResource: "User", withExtension: "json")!
let json = try? String(contentsOf: url)

そして、その json を Mapper で読み込む事ができます。

let mapper = Mapper<User>()
user = mapper.map(JSONString: json!)

実際のテストファイル

ここでは Quick + Nimble でテストを書いています。

用意した User を使い、テストを書いていきます。
イニシャライズは終わっているので、 User の挙動をテストするだけですね。

import Foundation
import Quick
import Nimble
import ObjectMapper

class UserSpec: QuickSpec {
    override func spec() {
        var user: User!
        let mapper = Mapper<User>()

        beforeEach {
            let url = Bundle(for: type(of: self)).url(forResource: "User", withExtension: "json")!
            let json = try? String(contentsOf: url)
            user = mapper.map(JSONString: json!)
        }

        describe("mapping") {
            it("JSON のパラメータがマッピング出来ていること") {
                expect(user.id).to(equal(1))
                expect(user.familyName).to(equal("苗字"))
                expect(user.givenName).to(equal("名前"))
            }
        }

        describe("fullName") {
            it("全角スペース区切りのフルネームを取得すること") {
                expect(user.fullName).to(equal("苗字 名前"))
            }
        }
    }
}

おわり

ObjectMapper を利用した Entity のテストが書けるようになりました。
ネストの深い Object でも JSON を用意すればいいので、テストが簡単にかけます

Swift4 では Codable が出てくるので ObjectMapper が不要になりますね、 Swift4 が待ち遠しいです