2009-04-16 3 views
1

싱글 톤 클래스가 있고 코드를 단위 테스트 할 수 없습니다. 첫 번째 작업어떻게 유닛이 obj-c에서 싱글 톤을 테스트합니까?

Db *db = [[Db alloc] initWithName:@"sample.db"]; 

[db createDb]; 

STAssertEquals([db existDb],YES,@"The db is not created!"); 

그러나 :

나는 시험과 같은 있습니다. 두 번째가 실행될 때, 나는 항상 initWithName 메소드에서 "null"을 얻는다. 싱글 톤 지원 코드를 제거하면 모두 예상대로 작동합니다.

나는 테스트를 해킹 할 수는 있지만 (지금 당장은 어떻게되는지 모르지만)이 문제를 처리하는 "poper"방법이 있는지 궁금해합니다.

싱글 톤은 여기에 있습니다 : http://code.google.com/p/chibiorm/source/browse/trunk/src/Db.m

+0

테스트 외부에서 싱글 톤을 어떻게 사용합니까? 싱글 톤에서 [[Db alloc] init]을해서는 안되지만 대신 단일 인스턴스를 반환하는 클래스 메서드를 호출해야합니다. – pgb

+0

그것을 사용하는 코드의 경우 예 ... 그렇다면 내부 동작을 테스트하는 방법은 무엇입니까? – mamcx

답변

3

싱글 톤은 단위 테스트에 어려운 때로는 가난한 디자인의 결과입니다.

내 추천은 정말로 싱글 톤이 필요한지 여부를 열심히 생각하는 것입니다.

0

어쩌면 Factory pattern을 사용하고 하나의 인스턴스 (실제로는 싱글 톤)를 나눠주는 팩토리를 만들 수 있습니다. 그런 다음 구현은 싱글 톤이 아니며 단위 콘텐츠를 하트 콘텐츠로 테스트 할 수 있습니다.

단점은 공장에서 가져 오지 않으면 자신의 인스턴스를 만들 때 언어로 보호되지 않는다는 것입니다. C++에서는 생성자를 비공개로 만들고 공장과 유닛 테스트 친구를 만들어이 문제를 극복 할 수 있습니다. Objective-C가 비슷한 기능을 가지고 있는지 확실하지 않습니다.

+0

샘플 구현을 알고 있습니까? 내가 아는 팩토리 코드는 다른 것들에 사용됩니다 ... – mamcx

0

두 번째 alloc에서 nil을 반환하지 말고 예외를 발생시켜야한다고 생각합니다. 싱글 톤을 사용하려면 두 개를 만들지 말아야합니다. :) 당신은 내가 하나 개 이상의 인스턴스가 결코 수 있음을 시행하고 있지 않다 볼 수 있듯이

@implementation MySingleton 

static id _instance = nil; 

+ instance 
{ 
    if (_instance == nil) { 
     // alloc/init 
     _instance = [[self alloc] init]; 
     … 
    } 
    return _instance; 
} 
… 
@end 

: 나는 싱글을 만들 것을 결정하는 경우에

하지만, 내 클래스처럼 보인다. 대신 인스턴스 메서드를 사용하여 인스턴스를 가져 오는 데 규칙을 사용하고 있습니다.

+1

확실히 [self alloc] init이어야합니다, 맞습니까? – Chuck

+0

수 있습니다. 줄임표가 보여 주듯이 누락 된 것이 있습니다. 나는 init 함수를'initWithName :'과 같은 매개 변수와 함께 사용하기 때문에 의도적으로 생략했다. 이제 생각해 보겠습니다. 당신이 옳다고 생각하고 인스턴스가 올바르게 초기화되었음을 보여 주어야합니다. –

0

여기에있는 녀석은 대답으로 쓰여졌을 것이지만, 필요에 따라 differnet 인스턴스를 제공하는 용도 카테고리입니다. 모두의 의견 가라사대받은 위

http://twobitlabs.com/2011/02/mocking-singletons-with-ocmock/

다른 사람 "싱글 나쁜 m'kay있다"무시해야합니다. 내가 객관적인 C로 전환했을 때 가장 먼저 한 일은 iOC 라이브러리를 작성하는 것이 었습니다. 왜냐하면 그 객관적인 C가 자바가 아니라는 것을 깨닫기 때문에 결코 사용하지 않았기 때문입니다. 자바 도그마에 관해서 블리 팅하는 사람들을 무시하십시오. 항상 doens't를 적용하십시오. 객관적인 c.

관련 문제