2012-09-18 9 views
10

Sto testando un metodo che chiama -[NSDate date] e utilizza l'ora di sistema come riferimento per fare qualche logica. Devo verificare se la logica è giusta in alcuni giorni specifici dell'anno, ma non posso aspettare fino a quel giorno. Quindi posso modificare la data di sistema a livello di codice durante il test dell'unità?Cambia la data di sistema per il test dell'unità Cocoa

+1

In generale, è possibile sovrascrivere '- [Data NSDate]' nella categoria per restituire una data specifica. – brigadir

risposta

12

È necessario utilizzare Mock object e in Objective C è possibile farlo facilmente con le categorie sostituendo solo i metodi necessari. Per esempio si potrebbe utilizzare la categoria:

// ------------- 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 

e in aggiunta è necessario 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); 
} 

e poi nel vostro unit test si sarà in grado di utilizzare in questo modo

SwizzleClassMethod([NSDate class], @selector(date), @selector(mockCurrentDate)); 
[NSDate setMockDate:@"2007-03-24 10:45:32 +0200"]; 
NSLog(@"Date is: %@", [NSDate date]); 
Problemi correlati