के लिए सिस्टम दिनांक बदलें मैं एक विधि का परीक्षण कर रहा हूं जो -[NSDate date]
पर कॉल करता है, और कुछ तर्क करने के संदर्भ में सिस्टम समय का उपयोग करता है। मुझे यह जांचने की ज़रूरत है कि क्या तर्क साल के कुछ विशिष्ट दिनों पर सही है, लेकिन मैं उस दिन तक इंतजार नहीं कर सकता। तो यूनिट परीक्षण करते समय क्या मैं सिस्टम की तारीख प्रोग्रामेटिक रूप से बदल सकता हूं?कोको इकाई परीक्षण
10
A
उत्तर
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]);
की तरह इसका इस्तेमाल करने में सक्षम हो जाएगा: उदाहरण के लिए आप निम्न श्रेणी के इस्तेमाल कर सकते हैं
सामान्य रूप से, आप विशिष्ट तारीख को वापस करने के लिए श्रेणी में '- [NSDate date]' ओवरराइड कर सकते हैं। – brigadir