0

応答ブロックとエラー ブロックを受け取るメソッドがあります。有効なデータと無効なデータを指定して単体テストを記述し、それぞれ応答ブロックとエラー ブロックを呼び出しますが、GHUnit と OCMock を使用して、正しいかどうかをテストするにはどうすればよいですかブロックが呼び出されますか?

私が考えていた:

有効なデータの場合: response { GHAssertTrue(YES, @""); エラー { GHAssertTrue(NO, @"有効なデータはエラー ブロックを呼び出さないでください"); }

無効なデータの場合はその逆です。

私がしたことは正しいですか?

4

2 に答える 2

0

アサーションをブロックに入れる際の問題は、どちらのブロックも呼び出されていないかどうかがわからないことです。これが私たちの仕事です:

__block BOOL done = NO;
[classUnderTest doSomethingWithResultBlock:^(BOOL success) {
    done = YES;
} errorBlock:^(BOOL success) {
    // should not be called
    expect(NO).to.beTruthy();
}];
while (!done) [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];

欠点は、成功ブロックが呼び出されない場合、テストが while ループでハングすることです。タイムアウトを追加することでそれを回避できます。

NSDate *startTime = [NSDate date];
__block BOOL done = NO;
[classUnderTest doSomethingWithResultBlock:^(BOOL success) {
    done = YES;
} errorBlock:^(BOOL success) {
    // should not be called
    expect(NO).to.beTruthy();
}];
while (!done && [startTime timeIntervalSinceNow] > -30) [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
// make sure it didn't time out
expect(done).to.beTruthy();
于 2012-11-01T18:57:23.760 に答える
0

代わりに私がすることは次のとおりです。

  • テストクラスにプロパティを追加して、どのブロックが呼び出されたかを示します
  • 各ブロックでそのプロパティを異なる値に設定する
  • 呼び出す
  • 物件の価値を調べる
于 2012-11-01T17:40:07.047 に答える