OCMock

2013-10-15 9 views
3

그래서 나는 내 수업 OCMock

@implementation CustomClass 

+ (void)method:(NSString*)string{ 
    [[self class] method:string object:nil]; 

} 

+ (void)method:(NSString *)string object:(id)object { 
    //do something with string and object 
} 

@end 

중 하나가 호출되는 클래스 메소드를 예상 할 수있게하려면 클래스 메소드를 기대 나는 [CustomClass method:@""]를 호출하고 내가 해봤 method: string:

예상 할 방법 swizzling하지만 그것은 단지 stubbing에 유용합니다 것 같습니다.

+0

내가 돈 ' 당신의 질문을 정말로 이해하지 못합니다. + (void) 메서드 호출 : (NSString *) 문자열 개체 : (id) + (void) 메서드에서 개체 : (NSString *) 문자열? –

+0

@ user2404543 네, 나중에 기능을 추가하기로 결심한다면 이탈 확인을 원합니다. –

+0

Im 얻을 수 없다는 것을 확신하지 못합니다. 왜 [CustomClass method : string object : nil]이라고 부르지 않습니까? ; + (void) 메서드에서 : (NSString *) 문자열? –

답변

3

두 가지 방법을 혼돈스럽게하거나 OCMock을 사용하여 테스트 할 수 있습니다. 방법 스위 즐링으로

, 우리가 테스트 구현 파일에 다음과 같은 변수를 선언 첫째 :

static NSString *passedString; 
static id passedObject; 

그럼 우리가 (테스트 클래스에서) 스텁 메소드를 구현하고, 스위 즐링로 이동합니다

+ (void)stub_method:(NSString *)string object:(id)object 
{ 
    passedString = string; 
    passedObject = object; 
} 

- (void) test__with_method_swizzling 
{ 
    // Test preparation 
    passedString = nil; 
    passedObject = [NSNull null];// Whatever object to verify that we pass nil 

    Method originalMethod = 
     class_getClassMethod([CustomClass class], @selector(method:object:)); 
    Method stubMethod = 
     class_getClassMethod([self class], @selector(stub_method:object:)); 

    method_exchangeImplementations(originalMethod, stubMethod); 

    NSString * const kFakeString = @"fake string"; 

    // Method to test 
    [CustomClass method:kFakeString]; 

    // Verifications 
    STAssertEquals(passedString, kFakeString, nil); 
    STAssertNil(passedObject, nil); 

    method_exchangeImplementations(stubMethod, originalMethod); 
} 

그러나 우리는 훨씬 간단한 방법으로 OCMock과 같은 작업을 수행 할 수 있습니다

- (void) test__with_OCMock 
{ 
    // Test preparation 
    id mock = [OCMockObject mockForClass:[CustomClass class]]; 

    NSString * const kFakeString = @"fake string"; 
    [[mock expect] method:kFakeString object:nil]; 

    // Method to test 
    [CustomClass method:kFakeString]; 

    // Verifications 
    [mock verify]; 
} 
+0

예제에 감사드립니다! 나는 비 OCMock 예제를 작동시킬 수 있었지만'Method stubMethod'를'class_getInstanceMethod'로 변경해야했습니다. OCMock 예제에서는 작동하지 못했습니다. 나는'NSProxy doesNotRecognizeSelector ... '를 얻는다. mock 객체는 클래스 자체 대신 CustomClass 인스턴스의 모의 객체이기 때문에 생각합니다. 클래스 메소드를 호출하면 인스턴스에 도달 할 수 없다. (나는 생각한다.) –

+0

나는 당신이 클래스 메소드가 아닌 하나의 인스턴스로 스텁 메소드를 선언했기 때문에 class_getInstanceMethod를 사용했다고 생각한다. 그리고 OCMock 샘플은 OCMock의 어떤 버전을 사용하고 있습니까 (2.1 이후로 클래스 메소드를 조롱 했습니까?). mock 객체가 인스턴스의 모의 객체라는 것을 알고 있습니다 만, 이것은 OCMock 클래스 메소드를 조롱하는 방법입니다 (docs를 확인하십시오). – e1985