2016-05-31 3 views
4

신생아입니다. OCMock입니다.OCMock은 테스트중인 코드에서 조롱 된 인스턴스를 자동으로 사용합니까?

내가 사용 dispatch_once()는 싱글 톤 클래스 MyManager 생성 :

@implementation MyManager 

+ (id)sharedInstance { 
    static MyManager *sharedMyManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedMyManager = [[self alloc] init]; 
    }); 
    return sharedMyManager; 
} 

을 내가 가지고 위의 싱글 사용 School 클래스의 메소드 : 단위 테스트이 방법에

이제
@implementation School 
... 
- (void) createLecture { 
    MyManager *mgr = [MyManager sharedInstance]; 
    [mgr checkLectures]; 
    ... 
} 
@end 

가, 내가 원하는을, MyManager의 일부 모의를 사용합니다.

- (void) testCreateLecture { 
    // create a partially mocked instance of MyManager 
    id partialMockMgr = [OCMockObject partialMockForObject:[MyManager sharedInstance]]; 

    // run method to test 
    [schoolToTest createLecture]; 
    ... 
} 

OCMock에서, 내 싱글 톤 MyManager 인스턴스의 부분 모의를 만든 후 테스트 할 때 내 메서드를 실행하면 이 자동적으로 부분적으로 조롱 된 인스턴스를 사용합니다.

위 내 테스트 케이스에 있기 때문에, 나에게 조금 이상해, 난 단지, MyManager 클래스에 주입하지 않고 MyManager 인스턴스의 부분적인 모형을 만들어 OCMock 자동 테스트 사용이 아래의 코드를 강제 않는 방법

테스트중인 코드에서 [MyManager sharedInstance]을 호출하면 조롱 된 인스턴스가 발생합니까? 누군가 나에게 이걸 설명 할 수 있을까?

답변

3

partialMockForObject 전달할 개체를 조롱합니다.

이 경우 사용자는 싱글 톤 (공유) 객체를 조롱합니다. sharedInstance은 항상 지금 조롱 된 동일한 객체를 반환하기 때문에 아무 것도 주입 할 필요가 없습니다. 그것은 여전히 ​​같은 참조입니다.

전달 된 객체의 단순한 변형으로 부분적 조롱을 상상해보십시오. 따라서 새 인스턴스를 만들지 않으므로이 특정 경우에 삽입 할 필요가 없습니다.

2

부분 모의가 아주 멋집니다. 뒤에서 OCMock은 당신이 조롱하고있는 클래스를 하위 클래스로 만들고, 여러분이 스텁 한 메서드는 부분 모의 하위 클래스에서 업데이트됩니다. 그래서 당신의 조롱 된 클래스에 대한 모든 참조는 슈퍼 클래스 (구현) 대신 서브 클래스 (조롱 된 구현)로 기본 설정됩니다. 이것에도 좋은 explanation in the reference이 있습니다.

+0

비록 @ 술탄의 대답을 받아 들였지만 답안의 정보 또한 나에게 매우 중요합니다! 감사! –

관련 문제