Expecta


マッチャーフレームワーク for Objective-C/Cocoa

ExpectaはGithubのメンバーが作ったマッチャーです。BDDフレームワークであるSpecta（これもGithub製）と組み合わせて使用すると、手軽にテストコードが書けます。特に非同期テストの書きやすさは秀逸です。是非皆さんも一度使ってみることをお勧めします。

このドキュメントは私が[specta/expecta](https://github.com/specta/expecta)から、自分が必要とする部分のみを抜粋して翻訳したものです。
翻訳に自信がない部分はそのままにしています。


## セットアップ

[CocoaPods](https://github.com/CocoaPods/CocoaPods)を使用します。


```ruby
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
```

使用準備

```objective-c
// #define EXP_OLD_SYNTAX // enable backward-compatibility
#define EXP_SHORTHAND
#import "Expecta.h"

```

もし`EXP_SHORTHAND`が定義されていない場合は、`expect`の代わりに`EXP_expect`で記述する必要があります。

Expectaはフレームワークに依存しません。
[Specta](http://github.com/petejkim/specta/)や[GHUnit](http://github.com/gabriel/gh-unit/)、[GTMUnit](http://code.google.com/p/google-toolbox-for-mac/)などの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またはNSString`x`が`y`の数または長さであれば合格
expect(x).to.beEmpty(); | NSArray、NSSet、NSDictionaryまたはNSString`x`が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`は希望するタイムアウトの時間です。