2013-08-17 13 views

答えて

12

Class mocksクラスインスタンスの純粋モックであるオブジェクトを作成します。

Partial mocksのインスタンスを使用すると、そのメソッドをスタブすることができます。

は、私は、これらのクラスがあるとします。

@interface Foo : NSObject 
- (void)doX; 
@end 
@implementation 
- (void)doX 
{ 
    NSLog(@"X"); 
} 
@end 

@interface Bar : NSObject 
- (void)doA:(Foo *)foo; 
- (void)doB; 
@end 
@implementation Bar 
- (void)doA:(Foo *)foo 
{ 
    NSLog(@"A"); 
    [foo doX]; 
    [self doB]; 
} 
- (void)doB 
{ 
    NSLog(@"B"); 
} 
@end 

私はテストバーのdoA:方法に興味があります。私はdoXFooオブジェクトに呼び出し、それ自身のdoBメソッドを呼び出すことを期待しています。私はFooのクラスモックとBarの部分モックを使ってこれを実装します。

- (void)test_doA_shouldCall_doX_and_doB 
{ 
    id objectUnderTest = [OCMockObject partialMockForObject:[Bar new]]; 
    id fooMock = [OCMockObject mockForClass:Foo.class]; 
    [[fooMock expect] doX]; 
    [[objectUnderTest expect] doB]; 
    // Make the call 
    [objectUnderTest doA:fooMock]; 
    [objectUnderTest verify]; 
    [fooMock verify]; 
} 

あなたは私の部分モックは私がそのインスタンスメソッドの他に内部の呼び出しをあざけるながら、私がテストしたかった本当のメソッドを呼び出すことが許されていることここを参照してください。しかし、Fooの本当の機能は必要ないので、私はクラスモックを使いました。

+0

本当に有益な答えをありがとう。私は2つのフォローアップの質問があります:1)純粋なモックがあなたに本当の方法を呼ぶことを許さないというのは本当ですか? 2)なぜあなたはFooの一部のモックを作り、次にdoXメソッドの期待をしていないのですか? – user1802143

+1

1.純粋なモックは実際のオブジェクトに裏打ちされていませんが、技術的には、 'andCall'や' andDo'を使って任意のメソッドを呼び出すようにモックを設定することができます - 部分モックでは 'andForwardToRealObject'を実行できます。 2. Fooの部分模擬を作成することができます - オブジェクトの作成に副作用があるか、テストに関係のない作業が含まれることがあります。さらに、予期しないメソッドが呼び出されたときに、疑似モックではない純粋なモックが呼び出されますが、部分モックは呼び出されません。 –

関連する問題