2013-08-17 37 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:方法。我期望它在Foo對象上調用doX,然後調用它自己的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

感謝您的真正有用的答案。我有兩個後續問題:1)純粹的嘲弄不允許你調用任何真正的方法是真的嗎? 2)爲什麼你不能創建Foo的部分模擬,然後對doX方法進行期望? – user1802143

+1

1.一個純粹的模擬不是由一個真實的對象支持的,但是從技術上講,你可以通過使用'andCall'或'andDo'設置任何模擬來調用任何方法 - 一個部分模擬允許你執行'andForwardToRealObject'。 2.你可以創建一個Foo的部分模擬 - 有時創建一個對象要麼有副作用,要麼涉及與你的測試無關的工作。此外,一個純粹的模擬不是一個很好的模擬會抱怨,當一個意想不到的方法被調用,而部分模擬不會。 –