Kiwiの非同期テストでハマった話

Objective-C - Kiwi で非同期テストを行う - Qiita [キータ]

やりかた自体はコレでよかったんだけど、場合によっては後で呼ばれるBlockが成功時と失敗時で分かれてる時があると思うんだけど、その時に

__blocks id success;
__blocks NSError *error;

[Hoge somethingCompletionBlockWithSuccess:^(NSObject o){
    success = o;
} failure:^(NSError *e){
    error = e;
}];

// successのObjectがちゃんと渡ってきて、Errorが返ってこなかったことを確かめたかった
[[expectFutureValue(success) shouldEventually] shouldNotBeNil];
[[expectFutureValue(error) shouldEventually] shouldBeNil];

とかってやると、テストが通らない。

somethingCompletionBlockWithSuccess:failure:は成功時と失敗時でどっちか片方しか呼ばれない感じのやつなんだけど、[expectFutureValue() shouldEventually]に変数渡すと、その変数の中にKWAsyncVerifierが入るっぽい。

それで、shouldBeNilが評価される段階で、expectFutureValueに渡した変数の中身が変わってないと、KWAsyncVerifierが入ってるので、error != nilになる。

あんま詳しく調べたわけじゃないから一部間違ってるかもだけど、こういう場合のテストは、どっちかだけ確かめるようにしないとダメだったらしい。

終わり。