1

この Stackoverflow の投稿: Selectors or Blocks for callbacks in an Objective-C libraryによると、

ブロックは ObjC の未来のようです。ただし、無名関数と同様に、ブロックは実装の「草稿」のように感じられます。また、その「組み込み」の性質により、それらを使いすぎると、単体テストまたは「テスト可能な」OOP という意味でのモジュール性が損なわれるのではないかと心配しています。

ブロックをテストする方法、およびブロックと通常のメソッドのテストを調整する方法に関するガイドラインはあまり見つかりませんでした。このトピックに関する適切なリソースはありますか?

4

3 に答える 3

17

ブロック内でアサーションを実行できるように、単体テストでブロックが実行されるのを待機する 3 つのマクロを作成しました。

#define TestNeedsToWaitForBlock() __block BOOL blockFinished = NO
#define BlockFinished() blockFinished = YES
#define WaitForBlock() while (CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, true) && !blockFinished)

例:

- (void)testWaitForBlock {
    TestNeedsToWaitForBlock();

    [target selectorWithInlineBlock:^(id obj) {

        // assertions

        BlockFinished();
    }];

    WaitForBlock();
}
于 2013-08-21T13:28:45.437 に答える
4

すでに試したかどうかはわかりませんが、私は iOS アプリケーションの単体テストに Kiwi を使用しています。驚くほど文書化されていませんが、ブロックのテストに使用できます。

https://github.com/allending/キウイ

彼らのウィキの「モックとスタブ」の下にある「引数のキャプチャ」を見てください。これを使用して、渡されるブロックをキャプチャできます。これは、非同期のコードに非常に役立ちます。テストするメソッドを呼び出し、完了ブロックをキャプチャして、すぐにブロックを同期的に実行し、非同期コードを効果的に同期させることができます。

実装の草稿を書いているように感じるブロックに関しては、そのようである必要はありません。インラインではなく、メソッドとしてブロックを定義します。実際、私はよくブロックを返すメソッドを書いて、コードをクリーンで簡単にテストできるようにしています。

それがあなたが探していたものかどうかはわかりません。

于 2013-06-09T18:55:55.443 に答える