2012-06-25 12 views
14

Tengo algunas especificaciones repetitivas que me gustaría SECAR. La funcionalidad común no se presta para moverse a un bloque beforeEach. Esencialmente, es creación de objeto y son 4 líneas para cada uno de los 12 objetos, me gustaría convertir esas 4 líneas en una sola llamada a función.Funciones auxiliares en las especificaciones de Kiwi

¿Dónde puedo poner funciones auxiliares en una especificación Kiwi?

En RSpec puedo simplemente poner def entre bloques de especificaciones, pero eso no parece posible aquí. Incluso intenté omitir la macro SPEC_END y agregar ese contenido para poder agregar funciones dentro de @implementation desde SPEC_BEGIN, pero eso tampoco parece funcionar.

Corrección ... Puedo manejar algo que funciona con la codificación manual de la macro SPEC_END. Tuve el final} mal colocado. Pero aún así, falla, porque el método no está en el @interface.

+1

ver este https://github.com/kiwi-bdd/Kiwi/issues/138 – onmyway133

Respuesta

33

Crear su función auxiliar como un bloque justo después de la SPEC_BEGIN:

SPEC_BEGIN(MySpec) 

NSDate* (^dateFromString) (NSString *) = ^NSDate* (NSString *dateString) { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
    [dateFormatter setDateFormat:@"MM-dd-yyyy"]; 
    return [dateFormatter dateFromString:dateString]; 
}; 


describe(@"something", ^{ 
    NSDate *checkDate = dateFromString(@"12-01-2005"); 

... 
}); 

SPEC_END 
+0

super útil! Muchas gracias. – bearMountain

+0

¿Es posible tener un asistente asíncrono? Digamos que si quería autenticarme contra un servidor remoto en el helper. – pshah

8

También puede crear una función recta C por encima del alcance SPEC_BEGIN().

NSString *makeAString() { 
    return @"A String"; 
} 

O si tiene funciones auxiliares que se utilizarán en varios archivos de especificaciones, colocar estas funciones en un archivo separado e importar la cabecera. He encontrado que esta es una gran manera de limpiar mis especificaciones.

+0

Podría jurar que lo intenté, pero ya no estoy seguro. Tendré que volver y echarle un vistazo. Esto es más o menos lo que quería. – Otto

+0

Esto me da la siguiente advertencia: aviso: no hay prototipo previo para la función '' [-Wmissing-prototipos] Esto se puede solucionar haciendo que el método estático: estática NSString * makeAString() { ...} –

+0

@SebastienMartin Nunca he visto este error. ¿Estás declarando la función antes de usarla? – bearMountain

5

supermarin sugiere el siguiente método:

@implementation KWSpec(Additions) 

+ (void)myHelperMethod:(Car*)car { 
      [[car shouldNot] beNil]; 
     }; 

@end 

SPEC_BEGIN(FooBarSpec) 

describe(@"A newly manufactured car", ^{ 
    it(@"should not be nil", ^{ 
     [self myHelperMethod:[CarFactory makeNewCar]]; 
    }); 
}); 

SPEC_END 

Otra opción es tan Doug suggests:

SPEC_BEGIN(FooBarSpec) 

void (^myHelperMethod)(Car*) = ^(Car* car){ 
     [[car shouldNot] beNil]; 
    }; 

describe(@"A newly manufactured car", ^{ 
    it(@"should not be nil", ^{ 
     myHelperMethod([CarFactory makeNewCar]); 
    }); 
}); 

SPEC_END 

Lo bueno de esto es que se presta muy bien a escenarios asincrónicos:

SPEC_BEGIN(FooBarSpec) 

__block BOOL updated = NO; 

void (^myHelperAsync)() = ^() 
{ 
    [[expectFutureValue(theValue(updated)) shouldEventually] beYes]; 
}; 

describe(@"The updater", ^{ 
    it(@"should eventually update", ^{ 
     [[NSNotificationCenter defaultCenter] addObserverForName:"updated" 
               object:nil 
               queue:nil 
              usingBlock:^(NSNotification *notification) 
     { 
      updated = YES; 
     }]; 
     [Updater startUpdating]; 
     myHelperAsync(); 
    }); 
}); 

SPEC_END 

Finalmente, si su método auxiliar reside en otra Clase R, gantaa sugiere un artilugio ingenioso:

@interface MyHelperClass 

+(void)externalHelperMethod:(id)testCase forCar:(Car*)car 
{ 
    void (^externalHelperMethodBlock)() = ^(){ 
     id self = testCase; //needed for Kiwi expectations to work 
     [[car shouldNot] beNil]; 
    }; 
    externalHelperMethodBlock(); 
} 

@end 

SPEC_BEGIN(FooBarSpec) 

describe(@"A newly manufactured car", ^{ 
    it(@"should not be nil", ^{ 
     [MyHelperClass externalHelperMethod:self forCar:[CarFactory makeNewCar]]; 
    }); 
}); 

SPEC_END 
Cuestiones relacionadas