2010-01-06 3 views
3

저는 유닛 테스트를하려고하는 NSUserDefaults에 의존하는 클래스를 가지고 있고 테스트 클래스에 모의 객체로 NSUserDefaults를 제공하고 있습니다.OCMock을 인자를 가진 메소드에 넣고 값을 반환합니다.

OCMockObject[NSUserDefaults]: unexpected method invoked: dictionaryForKey:@"response"

내가 NSUserDefaults 클래스의 인스턴스 메소드 조롱하기 위해 노력하고있어 :

[[[mockClass stub] andReturn:someDictionary] dictionaryForKey:@"aKey"] 

: 통화 형식을 사용하여

- (NSDictionary *)dictionaryForKey:(NSString *)defaultName; 

을 테스트를 실행할 때, 나는 오류 조롱에게 dictionaryForKey 메소드를 기대해야한다고 알려주는 것. 그러나 여하튼, 이것은 녹음되지 않았거나 mock이 'dictionaryForKey'호출을 기대하지 않는다는 오류가 나에게 알려주기 때문에 모의 객체에 기대하는 것을 알리는 것이 옳지 않습니다.

스텁의 andReturn을 호출하는 방법은 to this question과 매우 유사하지만 포스터는 반환 값을 얻고 있다고 말합니다. 내 테스트 케이스 :

-(void)testSomeWork 
{ 
    id userDefaultsMock = [OCMockObject mockForClass:[NSUserDefaults class]];  
    MyClass *myClass = [[MyClass alloc] initWith:userDefaultsMock]; 

    NSDictionary *dictionary = [NSDictionary dictionary]; 

    [[[userDefaultsMock stub] andReturn:dictionary] dictionaryForKey:@"response"]; 

    BOOL result = [myClass doSomeWork]; 

    STAssertTrue(result, @"not working right"); 

    [myClass release]; 
    [userDefaultsMock verify]; 
} 

내 클래스 :

@implementation MyClass 

@synthesize userDefaults; 
- (id)initWith:(NSUserDefaults *aValue) 
{ 
    if (self = [super init]) 
    { 
     self.userDefaults = aValue; 
    } 
    return self; 
} 

- (BOOL)doSomeWork 
{ 
    NSDictionary *response = [userDefaults dictionaryForKey:@"response"]; 

    if (response != nil) 
    { 
     // some stuff happens here 
     return YES; 
    } 

    return NO; 
} 
@end 

어떤 제안이?

답변

5

잘 모르겠 으면 확인해보아야하지만 검증시 스텁을 사용하는 것과 관련이 있습니다. 예상대로 verify를 사용해야합니다.

즉 당신이 (당신의 방법은 예상 메소드를 호출 사실 않았 음을 알리는 dictionaryForKey을 확인 사용이 경우

[[[userDefaultsMock expect] andReturn:dictionary] dictionaryForKey:@"response"]; 
... 
[userDefaultsMock verify]; 

:). 스텁을 사용하여 메소드가 모의 객체에서 주어진 메소드를 호출 할 수 있지만 호출 된 것을 확인할 필요는 없습니다.

관련 문제