2016-05-26 3 views
2

クラス内に2つのメソッドがあり、そのうちの1つが特定のパラメータを持つ別のメソッドを単に呼び出すメソッドがあります。方法は次のとおりです。OCMock:OCMPartialMockオブジェクトは、スタブではなく実際のメソッドを呼び出します。

-(void)loadAllFollowersForUser:(NSUInteger)userID withResponseHandler:(_Nullable CompletionHandler)handler { 
[self loadFollowersForUser:userID 
       fromOffSet:0 
        toLimit:100000 
     withResponseHandler:handler]; 
} 

-(void)loadFollowersForUser:(NSUInteger)userID fromOffSet:(NSInteger)offset toLimit:(NSInteger)limit withResponseHandler:(_Nullable CompletionHandler)handler { 
    NSLog(@"Actual loadFollowersForUser method got called!"); 
} 

私はTDDで手を入れていますが、OCMockを使用しています。私は単にloadAllFollowersが内部で私が唯一loadFollowersForUserメソッドをスタブとloadAllFollowersメソッドの実際の実装を呼び出したいので、私は部分的モックを使用しています他の方法に

- (void)testLoadAllFollowersCallsLoadFollowers { 
    id partialMockSUT = OCMPartialMock(self.sut); 

    OCMExpect([partialMockSUT loadFollowersForUser:[OCMArg any] 
             fromOffSet:[OCMArg any] 
              toLimit:[OCMArg any] 
           withResponseHandler:[OCMArg any]]); 

    [partialMockSUT loadAllFollowersForUser:123 
          withResponseHandler:^(BOOL success, id response, NSError *error) { 

          }]; 

    OCMVerifyAll(partialMockParser); 

} 

を呼び出していることをテストする次のテストを持っています。これはほぼ正確ですが、私のテストはいつも期待通りには失敗し、NSLogがコンソールに表示されます。私が試してみました

もの:

  1. This質問は私がやろうとしています何を示唆している私はparitalモックの動作を確認するために、他の一時的なメソッドを追加しようとしていると、彼らが期待どおりに実行するには、非常にする必要があります多くの可能性があります
  2. 私は、OCMockドキュメントを使用してOCMExpectインラインの後にメソッドのOCMStubを追加しようとしました。 this page

ブロックの問題が渡されたか、またはメソッドの戻り値の型が無効で、予期しない動作がないかどうかわかりません。

+1

http://ocmock.org/reference/#argument-constraintsのOCMockドキュメントを見てみると、「オブジェクトでもポインタもセレクタでもない引数は、任意のプレースホルダを使用して無視することはできません」と回避策があります。そこにスカラー引数があるので、それは問題かもしれません。 – marramgrass

+0

ありがとう!それは働いているようだ。それがスローされる例外は、あらゆる制約とスカラー値についての警告/エラーを投げるのではなく、期待に合致しないことです。これは、私は数時間の間、困惑してしまった。あなたはこれを回答として掲示してください。もう少しテストしてもそれを受け入れますか? –

答えて

3

the OCMock docsによると、[OCMArg any]プレースホルダは、"オブジェクト、ポインタ、セレクタ"を渡すだけです。

ここでの問題は、メソッドへのスカラー引数がある可能性があるため、期待できないことです。ドキュメントは、ignoringNonObjectArgsの呼び出しによってメソッドをスタブすることによって、スカラー引数を処理するための回避策を提案しています。そのように見えるかもしれません:

OCMExpect([[partialMockSUT ignoringNonObjectArgs] 
         loadFollowersForUser:[OCMArg any] 
           fromOffSet:0 // or any value 
            toLimit:0 // or any value 
         withResponseHandler:[OCMArg any]]); 

私はそれを自分で試していないので、100%確かではありません。

+0

私の場合のユーザーIDはNSUIntegerです。つまり、最初の引数もスカラーでなければなりません。ご協力いただきありがとうございます!ブロックベースの完了ハンドラをテストするには:) –

関連する問題