マッチャーフレームワーク 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
は希望するタイムアウトの時間です。