マッチャーフレームワーク for Objective-C/Cocoa
ExpectaはGithubのメンバーが作ったマッチャーです。BDDフレームワークであるSpecta(これもGithub製)と組み合わせて使用すると、手軽にテストコードが書けます。特に非同期テストの書きやすさは秀逸です。是非皆さんも一度使ってみることをお勧めします。
このドキュメントは私がspecta/expectaから、自分が必要とする部分のみを抜粋して翻訳したものです。
翻訳に自信がない部分はそのままにしています。
セットアップ
CocoaPodsを使用します。
target :MyApp do
# your app dependencies
end
target :MyAppTests do
pod 'Expecta', '~> 0.2.3' # expecta matchers
# pod 'Specta', '~> 0.1.11' # specta bdd framework
end
使用準備
// #define EXP_OLD_SYNTAX // enable backward-compatibility
# define EXP_SHORTHAND
# import "Expecta.h"
もしEXP_SHORTHANDが定義されていない場合は、expectの代わりにEXP_expectで記述する必要があります。
Expectaはフレームワークに依存しません。
SpectaやGHUnit、GTMUnitなどのOCUnit(SenTestingKit)やOCUnitコンパチブルなテストフレームワークと組み合わせて使うことができます。
組込済みのマッチャー
| 記述 | 説明 |
|---|---|
expect(x).to.equal(y); |
オブジェクトまたはプリミティブxとyを比較し、それらが同一(==)または同等(isEqual:)であれば合格 |
expect(x).to.beIdenticalTo(y); |
オブジェクトxとyを比較し、それらが同一で、同一のメモリアドレスを持っていれば合格 |
expect(x).to.beNil(); |
x がnilなら合格 |
expect(x).to.beTruthy(); |
xがtrue(non-zero)と評価されれば合格 |
expect(x).to.beFalsy(); |
xがfalse(zero)と評価されれば合格 |
expect(x).to.contain(y); |
NSArrayまたはNSStringのインスタンスxがyを含むなら合格 |
expect(x).to.beSupersetOf(y); |
NSArray、NSSet、NSDictionary または NSOrderedSetのインスタンスxがyの全ての要素を含むなら合格 |
| expect(x).to.haveCountOf(y); | NSArray、NSSet、NSDictionaryまたはNSStringxがyの数または長さであれば合格 |
| expect(x).to.beEmpty(); | NSArray、NSSet、NSDictionaryまたはNSStringxが0の数または長さであれば合格 |
| expect(x).to.beInstanceOf([Foo class]); |
xがクラスFooのインスタンスであれば合格 |
| expect(x).to.beKindOf([Foo class]); |
xがクラスfooのインスタンスである、またはxがFooクラスを継承するクラスのインスタンスであれば合格 |
| expect([Foo class]).to.beSubclassOf([Bar class]); | クラスFooがクラスBarのサブクラスであるか、クラスBarと同一であれば合格(クラスクラスタのためにbeKindOf()を使用します) |
| expect(x).to.beLessThan(y); |
xがyより小さければ合格 |
| expect(x).to.beLessThanOrEqualTo(y); |
xがy以下であれば合格 |
| expect(x).to.beGreaterThan(y); |
xがyよりも大きければ合格 |
| expect(x).to.beGreaterThanOrEqualTo(y); |
xがy以上であれば合格 |
| expect(x).to.beInTheRangeOf(y,z); |
xがyとzの範囲内であれば合格 |
| expect(x).to.beCloseTo(y); |
xがyに近ければ合格 |
| expect(x).to.beCloseToWithin(y, z); |
xがz内のyに近ければ合格 |
| expect(^{ code }).to.raise(@"ExceptionName"); | コードのブロック内でExceptionNameという名前の例外が発生すれば合格 |
| expect(^{ code }).to.raiseAny(); | コードのブロック内で任意の例外が発生すれば合格 |
| expect(x).to.conformTo(y); |
xがプロトコルyに準拠していれば合格 |
| expect(x).to.respondTo(y); |
xがセレクタyに応答すれば合格 |
| expect( code ).to.notify(@"NotificationName"); | コードのブロックがNotificationNameというNSNotificationを生成すれば合格 |
| expect( code ).to.notify(notification); | コードのブロックが渡されたnotificationの通知と等しいNSNotificationを生成すれば合格 |
| expect(x).to.beginWith(y); | NSString、NSArrayまたはNSOrderedSetのインスタンスxがyで始まれば合格(Also aliased by startWith) |
| expect(x).to.endWith(y); | NSString、NSArrayまたはNSOrderedSetのインスタンスxがyで終われば合格 |
マッチャーの反転
Every matcher's criteria can be inverted by prepending .notTo or .toNot:
全てのマッチャーは.notTo や .toNot を付けることで反転できます。
expect(x).notTo.equal(y);compares objects or primitives x and y and passes if they are not equivalent.
非同期テスト
全てのマッチャーは .will or .willNotを前に付加することによって、非同期のテストを実行することが出来ます。
expect(x).will.beNil();passes if x becomes nil before the timeout.
expect(x).willNot.beNil();passes if x becomes non-nil before the timeout.
デフォルトのタイムアウトは1.0秒です。この設定は [Expecta setAsynchronousTestTimeout:x] を呼び出すことで変更できます。
xは希望するタイムアウトの時間です。