iOS
テスト

Quickを使ってiOSプロジェクトをUnitTest

既存プロジェクトにUnitTestを追加

File → New → Targetを選択

スクリーンショット 2018-09-11 15.57.34.png

「iOS Unit Testing Bundle」を選択

スクリーンショット 2018-09-11 15.58.22.png

参考:
https://qiita.com/amagasu1234/items/86454f2f3b753a661f0c

Quick

Inspired by RSpecなテストフレームワーク、XCTestsより書きやすい読みやすい
https://github.com/Quick/Quick

導入

今回はCocoaPodsでインストール

def testing_pods
  pod 'Quick'
  pod 'Nimble'
end

target 'YourProjectTests' do
  testing_pods
end

pod installするとQuickとNimbleがインストールされる

テスト実装

アプリケーションの方で下記のようなextensionを実装していてこのpriceFormatというメソッドをテストしたいといったケースを例にします。

extension Int {

    func priceFormat() -> String {
        if self > 0 {
            let num = NSNumber(value: self)

            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            formatter.groupingSeparator = ","
            formatter.groupingSize = 3

            return formatter.string(from: num)!
        } else {
            return "-"
        }
    }
}
import Foundation
import Quick
import Nimble

@testable import <YourProject>

class IntSpec: QuickSpec {
    override func spec() {
        describe("値段フォーマットメソッドのテスト") {
            context("5桁のIntは") {
                let num:Int = 10000
                it("カンマが1つ入る") {
                    expect(num.priceFormat()).to(equal("10,000"))
                }
            }
            context("9桁のIntは") {
                let num:Int = 100000000
                it("カンマが2つ入る") {
                    expect(num.priceFormat()).to(equal("100,000,000"))
                }
            }
            context("3桁のIntには") {
                let num:Int = 100
                it("カンマが入らない") {
                    expect(num.priceFormat()).to(equal("100"))
                }
            }
        }
    }
}

@testtable importでプロジェクトをimportするのですが、今回少しハマったのがプロジェクトがFirebaseに依存している場合「Missing required module 'Firebase'」というエラーでテストが通らなくなります。

上記のPodfileにQuickとNimbleに加えてFirebaseも指定すると回避出来ました。