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つの方法(alloc
とinit...
方法)スタブいることを確認してください。また、両方のスタブ呼び出しが、クラスmock(クラス自体ではない)のインスタンスで行われていることを確認してください。
ドキュメント:あなたはあなたがリファクタリングすることはできません何らかの理由によるレガシーコードをテストしたい場合にはOCMock features
代替
でクラスメソッドセクションこの(奇妙な)ソリューションは、有用である可能性があります。ただし、コードを変更できる場合は、コードをリファクタリングしてExtClass
オブジェクトをパラメータとして返します。文字列ではなく、そのメソッドからExtClass
の作成を委任します。生産とテストコードは、この単純な例ではなく、もっと複雑な実際のケースでは、より簡単で明確になります。
メソッドの戻り値の型はBOOLで、文字列を返します。それらのものを編集して変更できますか?私はあなたが文字列を返すと思うが、私は確信していない。 – e1985
ありがとうございます。私はそれを修正しました。 – soguy