10
-[NSDate date]
을 호출하는 메서드를 테스트하고 일부 논리를 수행하기 위해 시스템 시간을 참조로 사용합니다. 논리가 일년 중 특정 요일에 맞는지 테스트해야하지만 그날까지는 기다릴 수 없습니다. 단위 테스트 때 프로그래밍 방식으로 시스템 날짜를 변경할 수 있습니까?코코아 단위 테스트의 시스템 날짜 변경
-[NSDate date]
을 호출하는 메서드를 테스트하고 일부 논리를 수행하기 위해 시스템 시간을 참조로 사용합니다. 논리가 일년 중 특정 요일에 맞는지 테스트해야하지만 그날까지는 기다릴 수 없습니다. 단위 테스트 때 프로그래밍 방식으로 시스템 날짜를 변경할 수 있습니까?코코아 단위 테스트의 시스템 날짜 변경
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
및 추가
당신이 SwizzleClassMethodvoid 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]);
처럼 사용할 수 있습니다 : 예를 들어, 당신은 다음과 같은 범주를 사용할 수 있습니다
일반적으로 범주의'- [NSDate date]'를 무시하여 특정 날짜를 반환 할 수 있습니다. – brigadir