2013-08-17 8 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의 클래스 모의 (mock)와 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의 일부 모의 객체를 만들 수 있습니다. 객체의 생성은 부작용이 있거나 테스트와 관련없는 작업을 포함하는 경우가 있습니다. 또한, 좋은 모의가 아닌 순수 모의는 예기치 않은 방법이 호출 될 때 불평 할 것이지만 부분 모의는 불리지 않을 것입니다. –