2013-08-29 23 views
7

私はOCMockでテストしたい方法がありますが、その方法はわかりません。事前にメソッドにパラメータとして渡されないOCMockでオブジェクトをモックする方法はありますか?

+(NSString *)foo:(NSString *)param 
{ 
    ExtClass *ext = [[ExtClass alloc] initWithParam:param]; 
    if ([ext someMethod]) 
     return @"A"; 
    else 
     return @"B"; 
} 

ありがとう:私は私のコード(外部ライブラリ)の一部として定義されていない ExtClassを模擬する必要があります!

+1

メソッドの戻り値の型はBOOLで、文字列を返します。それらのものを編集して変更できますか?私はあなたが文字列を返すと思うが、私は確信していない。 – e1985

+0

ありがとうございます。私はそれを修正しました。 – soguy

答えて

19

OCMock 2

id mock = [OCMockObject mockForClass:[ExtClass class]]; 
// We stub someMethod 
BOOL returnedValue = YES; 
[[[mock stub] andReturnValue:OCMOCK_VALUE(returnedValue)] someMethod]; 

// Here we stub the alloc class method ** 
[[[mock stub] andReturn:mock] alloc]; 
// And we stub initWithParam: passing the param we will pass to the method to test 
NSString *param = @"someParam"; 
[[[mock stub] andReturn:mock] initWithParam:param]; 

// Here we call the method to test and we would do an assertion of its returned value... 
[YourClassToTest foo:param]; 

OCMock3

// Parameter 
NSURL *url = [NSURL URLWithString:@"http://testURL.com"]; 

// Set up the class to mock `alloc` and `init...` 
id mockController = OCMClassMock([WebAuthViewController class]); 
OCMStub([mockController alloc]).andReturn(mockController); 
OCMStub([mockController initWithAuthenticationToken:OCMOCK_ANY authConfig:OCMOCK_ANY]).andReturn(mockController); 

// Expect the method that needs to be called correctly 
OCMExpect([mockController handleAuthResponseWithURL:url]); 

// Call the method which does the work 
[self.myClassInstance authStarted]; 

OCMVerifyAll(mockController); 

ノート

両方のケースでは、あなたが2つの方法(allocinit...方法)スタブいることを確認してください。また、両方のスタブ呼び出しが、クラスmock(クラス自体ではない)のインスタンスで行われていることを確認してください。

ドキュメント:あなたはあなたがリファクタリングすることはできません何らかの理由によるレガシーコードをテストしたい場合にはOCMock features

代替

クラスメソッドセクションこの(奇妙な)ソリューションは、有用である可能性があります。ただし、コードを変更できる場合は、コードをリファクタリングしてExtClassオブジェクトをパラメータとして返します。文字列ではなく、そのメソッドからExtClassの作成を委任します。生産とテストコードは、この単純な例ではなく、もっと複雑な実際のケースでは、より簡単で明確になります。

+0

ありがとう!いいね。私はそれをテストします。 – soguy

+0

'alloc'ごとに異なるオブジェクト/モックを返すことは可能ですか?これは、異なる値の 'param'(すなわち、通常/非シングルトンセマンティクスを持つ' ExtClass')でいくつかのインスタンスを維持するために必要なようです。関連する質問[here](http://stackoverflow.com/questions/28240858/how-to-partially-mock-an-object-inside-legacy-code-with-ocmock)を参照してください。どうも。 – Drux

+0

これはOCMockバージョン3では動作していないようですが、間違っている可能性があります。 –

関連する問題