2012-09-18 8 views
10

के लिए सिस्टम दिनांक बदलें मैं एक विधि का परीक्षण कर रहा हूं जो -[NSDate date] पर कॉल करता है, और कुछ तर्क करने के संदर्भ में सिस्टम समय का उपयोग करता है। मुझे यह जांचने की ज़रूरत है कि क्या तर्क साल के कुछ विशिष्ट दिनों पर सही है, लेकिन मैं उस दिन तक इंतजार नहीं कर सकता। तो यूनिट परीक्षण करते समय क्या मैं सिस्टम की तारीख प्रोग्रामेटिक रूप से बदल सकता हूं?कोको इकाई परीक्षण

+1

सामान्य रूप से, आप विशिष्ट तारीख को वापस करने के लिए श्रेणी में '- [NSDate date]' ओवरराइड कर सकते हैं। – brigadir

उत्तर

12

आपको Mock object और उद्देश्य सी में उपयोग करने की आवश्यकता है, आप केवल उन्हीं विधियों को ओवरराइड करके श्रेणियों के साथ आसानी से कर सकते हैं।

// ------------- 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]); 
की तरह इसका इस्तेमाल करने में सक्षम हो जाएगा: उदाहरण के लिए आप निम्न श्रेणी के इस्तेमाल कर सकते हैं
संबंधित मुद्दे