2012-09-18 6 views
10

-[NSDate date]을 호출하는 메서드를 테스트하고 일부 논리를 수행하기 위해 시스템 시간을 참조로 사용합니다. 논리가 일년 중 특정 요일에 맞는지 테스트해야하지만 그날까지는 기다릴 수 없습니다. 단위 테스트 때 프로그래밍 방식으로 시스템 날짜를 변경할 수 있습니까?코코아 단위 테스트의 시스템 날짜 변경

+1

일반적으로 범주의'- [NSDate date]'를 무시하여 특정 날짜를 반환 할 수 있습니다. – brigadir

답변

12

Mock object을 사용해야하며 Objective C에서는 필요한 방법 만 재정 의하여 범주를 사용하여 쉽게 할 수 있습니다.

// ------------- File: NSDate+NSDateMock.h 
@interface NSDate (NSDateMock) 

+(void)setMockDate:(NSString *)mockDate; 
+(NSDate *) mockCurrentDate; 

@end 

// -------------- File: NSDate+NSDateMock.m 

#import "NSDate+NSDateMock.h" 

@implementation NSDate (NSDateMock) 

static NSDate *_mockDate; 

+(NSDate *)mockCurrentDate 
{ 
    return _mockDate; 
} 

+(void)setMockDate:(NSString *)mockDate 
{ 
    _mockDate = [NSDate dateWithString:mockDate]; 
} 

@end 

및 추가

당신이 SwizzleClassMethod

void SwizzleClassMethod(Class c, SEL orig, SEL new) { 

    Method origMethod = class_getClassMethod(c, orig); 
    Method newMethod = class_getClassMethod(c, new); 

    c = object_getClass((id)c); 

    if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) 
     class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod)); 
    else 
     method_exchangeImplementations(origMethod, newMethod); 
} 

가 필요합니다 다음 단위 테스트에서이

SwizzleClassMethod([NSDate class], @selector(date), @selector(mockCurrentDate)); 
[NSDate setMockDate:@"2007-03-24 10:45:32 +0200"]; 
NSLog(@"Date is: %@", [NSDate date]); 
처럼 사용할 수 있습니다 : 예를 들어, 당신은 다음과 같은 범주를 사용할 수 있습니다
관련 문제