6

皆さん、私は何年もの間、Kiwi テストを使用してデリゲート メソッドを非同期的にテストする方法について、いくつかの良い例を見つけようと努めてきました。

テスト用のプロトコルを定義するマネージャ クラスがあり、デリゲートで pass メソッドと fail メソッドが返されます。これを行う方法についてサンプルコードを提供できる人はいますか? マネージャーでメソッドを呼び出すために、テスト クラス自体に を実装させることはできますか?

みんなありがとう

4

2 に答える 2

6

例のようにすることができます

 SPEC_BEGIN(IFStackOverflowRequestSpec)

describe(@"IFStackOverflowRequestSpec", ^
{
    context(@"question request", ^
    {
        __block IFViewController *controller = nil;

         beforeEach(^
         {
             controller = [IFViewController mock];
         });

        it(@"should conform StackOverflowRequestDelegate protocol", ^
        {
             [[controller should] conformToProtocol:@protocol(StackOverflowRequestDelegate)];
        });

         it(@"should recieve receivedJSON", ^
         {
             NSString *questionsUrlString = @"http://api.stackoverflow.com/1.1/search?tagged=iphone&pagesize=20";

             IFStackOverflowRequest *request = [[IFStackOverflowRequest alloc] initWithDelegate:controller urlString:questionsUrlString];
             [[request fetchQestions] start];
             [[[controller shouldEventuallyBeforeTimingOutAfter(3)] receive] receivedJSON:any()];
         });

         it(@"should recieve fetchFailedWithError", ^
         {
             NSString *fakeUrl = @"asda";
             IFStackOverflowRequest *request = [[IFStackOverflowRequest alloc] initWithDelegate:controller urlString:fakeUrl];
             [[request fetchQestions] start];
             [[[controller shouldEventuallyBeforeTimingOutAfter(1)] receive] fetchFailedWithError:any()];
         });
    });
});

完全な例は、このリンクにあります。

于 2013-01-15T09:02:33.347 に答える
4

デリゲートの代わりになるモック オブジェクトを作成し、期待するデリゲート コールバックをモック オブジェクトが受け取ることを確認することで、達成しようとしていると私が思うことを実行できます。したがって、プロセスは次のようになります。

  • デリゲート プロトコルに準拠するモック オブジェクトを作成します。

id delegateMock = [KWMock mockForProtocol:@protocol(YourProtocol)];

  • モックをマネージャー クラスのデリゲートとして設定します。

[manager setDelegate:delegateMock];

  • マネージャー クラスによって返されるデータを含むオブジェクトを作成します。

NSString *response = @"foo";

  • モックが最終的にメソッドと応答オブジェクトで呼び出される必要があるというアサーションを設定します (この場合、私は受け取ることを期待していますmanagerRepliedWithResponseand foo)

[[[delegateMock shouldEventually] receive] managerRepliedWithResponse:response];

  • テスト対象のメソッドを呼び出します。

[manager performMyMethod];

重要なのは、メソッドを呼び出すに期待値を設定することです。これを使用shouldEventuallyすると、チェックされるアサーションが遅延しmanager、メソッドを実行する時間がオブジェクトに与えられます。

Kiwi wiki - https://github.com/allending/Kiwi/wiki/Expectationsにリストされている、使用できる期待の範囲もあります。

私が扱っていた状況に合わせてより具体的に調整されていますが、私は自分のサイトの投稿でプロセスをより詳細に書いています.

于 2012-12-05T06:08:49.870 に答える