2010-10-20 12 views
16

En la mayoría de mis clases que trabajan con valores por defecto que ponga los valores predeterminados del objeto configurable:¿Cómo probar con NSUserDefaults?

@property(retain) NSUserDefaults *defaults; 

Esto se supone que hace la prueba más fácil:

// In a nearby test class: 
- (void) setUp { 
    [super setUp]; 
    NSUserDefaults *isolatedDefaults = [[NSUserDefaults alloc] init]; 
    [someObjectBeingTested setDefaults:isolatedDefaults]; 
} 

Pero ahora que he descubierto a continuación, cuando se crea un nuevo objeto predeterminado, ya hay algunos valores en él. ¿Es eso posible? Pensé que podría crear un objeto vacío predeterminado aislado llamando al -init. ¿Tengo algún error en algún lugar del código de prueba, o realmente tengo que hacer algo más complejo (como anotaciones o burlas) si quiero probar mi código basado en los valores predeterminados?

Respuesta

8

Al final he creado un reemplazo simple NSUserDefaults que se puede utilizar para controlar el entorno predeterminado en las pruebas. El código está disponible en GitHub.

+0

¡Gracias por crear esto! – Palimondo

+0

muy agradable, gracias! Ahora estoy usando tu clase, pero en lugar de inyectar 'NSUserDefaults' como un param a' someObjectBeingTested', estoy usando 'Kiwi' con su habilidad de burlarse de stub. Usando algo como: 'id transientDefaults = [NSUserDefaults transientDefaults]; [NSUserDefaults stub: @selector (standardUserDefaults) andReturn: transientDefaults]; ' – kernix

6

De la documentación NSUserDefaults:

init: Devuelve un objeto NSUserDefaults inicializado con los valores predeterminados para la cuenta de usuario actual.

Normalmente, esto no debe estar vacío. No estoy seguro de qué quiere probar aquí, ya que sería una pérdida de tiempo probar la funcionalidad NSUserDefaults.

Pero supongamos que necesita algunas claves para que no esté registrado todavía para su prueba para tener siempre el mismo punto inicial: luego simplemente elimínelas en setUp (y restablézcalas más tarde en tearDown si lo desea).

Algo así como:

- (void) setUp { 
    [super setUp]; 

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"myTestKey"]; 

    // synchronize the change, or just use resetStandardUserDefaults: 
    [someObjectBeingTested setDefaults:[NSUserDefaults resetStandardUserDefaults]]; 
} 

Si usted no tiene una lista específica de llaves, pero hay que acabar con todo, se tendrá que utilizar las Preferencias CoreFoundation Utilidades, consulte CFPreferencesCopyKeyList.

+0

Quiero probar el código que utiliza los valores predeterminados del usuario para algunas entradas y salidas. Si utilizo los valores predeterminados de los usuarios "reales", me resultaría difícil controlar el entorno. Tendría que eliminar los valores no deseados, restaurar otros después de ejecutar las pruebas, etc. Al final escribí un tipo de reemplazo por defecto para fines de prueba, ver mi respuesta. ¡Gracias! – zoul

+0

Por alguna razón, configurar una clave BOOL para NO no funcionó, pero el uso de removeObjectForKey funcionó perfectamente. Así que gracias por la propina. – phatmann