SwiftでSpec風なテストが書けるQuick(Nimble)のMatcherを使う時にコンパイルエラーになってしまったので調べたメモ。
Quickについてはこことかで
初めに書いたの:
class HogeSpec: QuickSpec {
let dic = NSMutableDictionary()
dic.setValue("hoge", forKey("name"))
it("nameのキーで何か文字列が入ってるのを確認したい") {
expect(dic["name"]).to(beAKindOf(NSString.self))
// ↑ コンパイルエラー: Could not find member 'to'
}
}
なんでコンパイルエラーになるのか調べてみた。
beAKindOf
の宣言を見てみた
public func beAKindOf(expectedClass: AnyClass) -> MatcherFunc<NSObject>
型パラメータがNSObject
のMatcherFuncを返してる。
to
の宣言を見てみた
public struct Expectation<T> {
// 中略
public func to<U where U: Matcher, U.ValueType == T>(matcher: U)
型パラメータの制約(where)で、U.ValueType
、つまりmatcherの型パラメータが、T
と同じじゃないとダメ。
※Expectation
は expect(...) で返されるやつ
NSDictionary
はAnyObject!
を返すので、T(AnyObject)
が U.ValueType(NSObject)
と違うのでこの型の組み合わせだと to は呼べない。
じゃあNSObject
にキャストしてやればいいじゃん。
書き換えた:
class HogeSpec: QuickSpec {
let dic = NSMutableDictionary()
dic.setValue("hoge", forKey("name"))
it("nameのキーで何か文字列が入ってるのを確認したい") {
expect(dic["name"] as NSObject!).to(beAKindOf(NSString.self))
}
}
なんでAnyObject
じゃなくてNSObject
になってるのかと思ったけどObjective-Cからでも使えるようにかな?