2012-06-29 3 views
3

나는이 :iOS 유닛은 개인 모의 객체를 테스트하나요? 내 Xcode 프로젝트에서

  • 컨트롤러
  • (싱글) databaseController

databaseController는 컨트롤러 클래스 내에서 인스턴스화됩니다.

실제 databaseController에 종속되지 않고 컨트롤러 클래스가 올바르게 작동하는지 확인하기 위해이 databaseController를 mock 객체로 바꾸려면 어떻게해야합니까?

메모 :
- 단위 테스트에는 OCUnit이 사용됩니다.
- OCock은 모의 개체를 만드는 데 사용됩니다.

보너스 질문 : databaseController가 싱글 톤이 아니면 어떨까요?

+0

databaseController가 싱글 톤이 아닌 경우 "응용 프로그램 요구 사항에 대해 더 알지 못하는 경우 애매한 질문입니다. –

답변

2

내가 취한 접근 방식입니다. 당신의 싱글에서 :

static SomeManager *_sharedInstance = nil; 

+(SomeManager *)sharedInstance { 
    if (_sharedInstance == nil) { 
     _sharedInstance = [[SomeManager alloc] init]; 
    } 
    return _sharedInstance; 
} 

+(void)setSharedInstance:(SomeManager *)instance { 
    _sharedInstance = instance; 
} 

그런 다음 테스트 :

-(void)testSomethingThatUsesSingleton { 
    id mockManager = [OCMockObject mockForClass:[SomeManager class]]; 
    [SomeManager setSharedInstance:mockManager]; 
    [[mockManager expect] something]; 

    [controller doSomething]; 

    [mockManager verify]; 
    [SomeManager setSharedInstance:nil]; 
} 

는 테스트의 끝에서 다시 전무로 싱글을 설정하는 것을 잊지 마십시오. 일반적으로 내 단위 테스트 기본 클래스의 tearDown에서이 작업을 수행하므로 각 테스트 후에 자동으로 발생합니다.

또는 create a category in your unit tests that overrides sharedInstance to return a mock object 수 있습니다.

+0

이것은 Singleton 개체에서 작동합니다. 저는 여전히 일반 모의 객체로 수수께끼를 짓고 있습니다 만, 저는 그것을 스스로 알아 내려고 노력할 것입니다. Thx 도움! –

+0

의존성 주입에 대해 읽는 것이 도움이 될 수 있습니다. 패턴이 생겼던 주된 이유 중 하나는 사람들이 테스트를 위해 모의 객체를 사용하여 사용자가 직면 한 정확한 문제에 부딪혔다는 것입니다. 그리고 네, 대답은 : databaseController를 컨트롤러에 넣지 말고, 사용할 databaseController를 설정할 수있게하십시오. –