2012-11-28 6 views
6

H男、 私は、キウイテストを使用してデリゲートメソッドを非同期にテストする方法の良い例を見つけることを長年試みてきました。Kiwiと非同期にデリゲートをテストする方法

私は、テストのためのプロトコルを定義するマネージャクラスを持っています。パスとフェイルのメソッドがデリゲートで返されます。誰でもこれを行う方法のサンプルコードを提供できますか?テストクラス自体を実装して、マネージャ上のメソッドを呼び出すことはできますか?

みんなありがとう

答えて

4

私はあなたがモックオブジェクトは、あなたが期待するデリゲートのコールバックを受け取ることを確認し、その後、デリゲートのためで立ってモックオブジェクトを作成し、によって達成しようとしている思い何を行うことができます。デリゲートプロトコルに準拠モックオブジェクトを作成

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

  • は、あなたのマネージャークラスのデリゲートとしてモックを設定:
  • だから、プロセスは次のようになります。

[manager setDelegate:delegateMock];

  • あなたのマネージャクラスによって返されるデータを含むオブジェクトを作成するには:

NSString *response = @"foo";

  • モックが結局する方法と、レスポンスオブジェクトと呼ばれるべきという主張を設定します(この場合、私はmanagerRepliedWithResponsefooを受け取ることを期待しています)

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

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

[manager performMyMethod];

キーを使用して、メソッドを呼び出す前に期待を設定し、shouldEventuallyを使用してチェックされてアサーションを遅延して与えるれます方法を実行するオブジェクト時間。私は私が扱った状況にそれをより具体的だとギアアップはいえ、in more detail in a post on my siteをプロセスを書いてhttps://github.com/allending/Kiwi/wiki/Expectations

- キウイのwikiに掲載されていますが、使用することもでき期待の範囲があります

+2

+1に設立することができますようにあなたが行うことができます! "キーは、あなたが方法を呼び出す前に期待を設定しています" – Bach

+0

それは今一年以上されていると私は同じことに苦労しています。 expectFutureValue/withoutを使用すると、前後で動作しません。私はこの要求を待っている気がすることができる唯一の方法は、どこかで確認するという本当の価値があることです。 – Hugo

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()]; 
     }); 
    }); 
}); 

完全な例は非常に微妙ですが、非常に重要な詳細はthis link.

関連する問題