2011-04-20 11 views
5

Tengo mucha funcionalidad en mi aplicación que depende de la fecha/hora (por ejemplo, "si la fecha es x, muestra y). Utilizo [NSDate date] para obtener la fecha/hora actual del usuario. Puedo probar la funcionalidad al cambiar manualmente la fecha/hora en mi iPhone, pero me pregunto si hay una forma de sobrescribir programáticamente la hora actual para que pueda probar en el simulador y más rápidamente.Establecer la fecha y hora de iPhone dentro de la aplicación para fines de prueba?

Respuesta

3

Puede crear objetos NSDate con cualquier fecha ./hora que desee ejecutar su código a través de un método para obtener "la corriente" tiempo y dentro de este método, ya sea devolver la fecha real para la producción o alguna fecha de su elección para la prueba

0

dateByAddingTimeInterval:.

Devuelve un nuevo objeto NSDate que se establece en un número determinado de segundos en relación con el receptor.

- (id)dateByAddingTimeInterval:(NSTimeInterval)seconds 

Parámetros segundos el número de segundos para añadir al receptor. Use un valor negativo por segundos para que el objeto devuelto especifique una fecha antes del receptor. Valor devuelto Un nuevo objeto NSDate que se establece en segundos segundos en relación con el receptor. La fecha devuelta podría tener una representación diferente a la del receptor.

fuente: la documentación: p

+2

No creo que quiera un método de prueba de marco sino más bien un método de sistema para realizar una prueba de "avance" en toda la aplicación. Es como cuando prueba una aplicación que no es para dispositivos móviles configurando el tiempo del sistema de la unidad de escritorio en algo así como 1/1/2040 para ver si eso rompe algo. – TechZen

5

Otra forma de hacerlo es proporcionar una implementación personalizada de + (NSDate *) Fecha. Puede swizzle este método de clase usando JRSwizzle. Hacer una pequeña categoría para el NSDate:

static NSTimeInterval seconds = 1300000000; 

@interface NSDate (Fixed) 
    + (NSDate *)fixedDate; 
@end 

@implementation NSDate (Fixed) 
+ (NSDate *)fixedDate 
{ 
    return [NSDate dateWithTimeIntervalSince1970:seconds]; 
} 
@end 

Luego, en el código en el que desea tener fecha fija haga lo siguiente:

NSError *error; 
[NSDate jr_swizzleClassMethod:@selector(date) withClassMethod:@selector(fixedDate) error:&error]; 
NSLog(@"Date:%@", [NSDate date]); 

se imprime el registro fuera de este:

2011-09-01 11:35:27.844 tests[36597:10403] Date:2011-03-13 07:06:40 +0000 
2

Cree una categoría en NSDate y anule +[NSDate date] método

+ (instancetype)date 
{ 
    return [NSDate dateWithTimeIntervalSince1970:100000]; // Replace with any date you want 
} 
Cuestiones relacionadas