2012-09-18 10 views
10

Estoy probando un método que llama a -[NSDate date], y utiliza la hora del sistema como referencia para hacer algo de lógica. Necesito probar si la lógica es correcta en algunos días específicos del año, pero no puedo esperar hasta ese día. Entonces, ¿puedo cambiar la fecha del sistema programáticamente cuando pruebo la unidad?Cambiar la fecha del sistema para la prueba de unidad de cacao

+1

En general, puede anular '- [NSDate date]' en la categoría para devolver una fecha específica. – brigadir

Respuesta

12

Necesita usar Mock object y en Objective C puede hacerlo fácilmente con categorías anulando solo los métodos que necesite. Por ejemplo, podría utilizar la siguiente categoría:

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

y, además, tendrá que 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); 
} 

y luego en su prueba de la unidad usted será capaz de utilizar de esta manera

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