2009-08-23 12 views
27

Recientemente comencé a aprender Objective-C y escribo mis pruebas utilizando OCUnit que viene incluido con Xcode.BDD en Objective-C

Soy programador de Ruby desde hace mucho tiempo y estoy acostumbrado a RSpec y Cucumber - nice BDD frameworks.

¿Hay un marco BDD decente para usar en Objective-C? Me falta mi 'deberías' :)

Respuesta

17

Hay un proyecto relativamente nuevo llamado uispec que se inspiró en las pruebas DSL de RSpec. La especificación ejemplo es el siguiente:

#import "DescribeEmployeeAdmin.h" 
#import "SpecHelper.h" 

@implementation DescribeEmployeeAdmin 

-(void)before { 
    //login as default admin before each example 
    [SpecHelper loginAsAdmin]; 
} 

-(void)after { 
    //logout after each example 
    [SpecHelper logout]; 
} 

-(void)itShouldHaveDefaultUsers { 
    //Check that all default users are in list 
    [[app.tableView.label text:@"Larry Stooge"] should].exist; 
    [[app.tableView.label text:@"Curly Stooge"] should].exist; 
    [[app.tableView.label text:@"Moe Stooge"] should].exist; 
} 

-(void)itShouldAddAUser { 
    //Click the + button 
    [app.navigationButton touch]; 

    //Set the form fields. 
    //Also ".with" is optional so we here we can show the different syntax 
    [[app.textField.with placeholder:@"First Name"] setText:@"Brian"]; 
    [[app.textField.with placeholder:@"Last Name"] setText:@"Knorr"]; 
    [[app.textField.with placeholder:@"Email"] setText:@"[email protected]"]; 
    [[app.textField placeholder:@"Username"] setText:@"bkuser"]; 
    [[app.textField placeholder:@"Password"] setText:@"test"]; 
    [[app.textField placeholder:@"Confirm"] setText:@"test"]; 

    //Click the Save button 
    [[app.navigationButton.label text:@"Save"] touch]; 

    //Make sure the error alert view doesn't appear 
    [app timeout:1].alertView.should.not.exist; 

    //User list should now have a new entry 
    [[app.tableView.label text:@"Brian Knorr"] should].exist; 
} 

@end 

Tenga en cuenta que nunca he usado, así que hay una posibilidad de que no se ajuste a sus necesidades exactamente. Pero al menos, podrá utilizar la base de código como inspiración para escribir su propio marco de prueba.

+0

El proyecto parece estar activo y se ve como lo que necesito. ¡Gracias! –

+0

Gracias, esto es muy bueno. –

0

No hay nada que te impida poner a prueba tu método de prueba con Should. Lo hice con NUnit en C#.

+0

Lo que estoy buscando es una sintaxis específica para la verificación. En Ruby se ve así: method_under_test (args) .should be_valid –

+1

La persona que hace la pregunta habla de Objective-C y OCUnit, que espera que los métodos de prueba comiencen con "prueba", así es como sabe qué métodos se prueban métodos, ya que Objective-C no tiene anotaciones como C# y Java do. –

8

Eche un vistazo a cómo se implementan las macros STAssert en OCUnit (SenTestingKit, incluidas con Xcode).

en su propio paquete de prueba de unidad, que podría poner en práctica una categoría en NSObject añadir métodos como una hipotética -shouldBeValid que luego llamar a la misma pasa/no pasa maquinaria que los STAssert macros hacen ahora.

En caso de que no esté íntimamente familiarizado con el preprocesador de C ...

Es posible que también tiene que utilizar un #define para sus macros para pasar a través de los valores correctos para __FILE__ y __LINE__ Cuando los análisis de BDD fallar. Por ejemplo, puede que tenga que hacer algo como esto:

@interface NSObject (BehaviorDrivenDevelopment) 
- (void)shouldBeValidInFile:(const char *)file line:(int)line; 
@end 

#define shouldBeValid shouldBeValidInFile:__FILE__ line:__LINE__ 

De esa manera debe invocar esta manera:

[[someObject methodUnderTest:argument] shouldBeValid]; 

El código del compilador ve que será este:

[[someObject methodUnderTest:argument] shouldBeValidInFile:__FILE__ line:__LINE__]; 

Las macros del preprocesador __FILE__ y __LINE__ se expandirán al archivo y la línea actuales en el archivo fuente de prueba.

De esta manera, cuando tiene una prueba que falla, puede pasar la información apropiada a SenTestingKit para enviar de vuelta a Xcode. La falla se mostrará correctamente en la ventana Generar resultados, y al hacer clic en ella, accederá a la ubicación exacta de la falla en sus pruebas.

14

Adam Milligan de Pivotal Labs ha creado un marco BDD para Objective-C llamado Cedar que se dirige tanto a Cocoa como a Cocoa Touch. Utiliza bloques de forma similar a RSpec. He aquí un ejemplo de especificación:

SPEC_BEGIN(FooSpecs) 

sharedExamplesFor(@"a similarly-behaving thing", ^(NSDictionary *context) { 
    it(@"should do something common", ^{ 
     ... 
    }); 
}); 

NSDictionary *context = [NSDictionary dictionary]; 

describe(@"Something that shares behavior", ^{ 
    itShouldBehaveLike(@"a similarly-behaving thing", context); 
}); 

describe(@"Something else that shares behavior", ^{ 
    itShouldBehaveLike(@"a similarly-behaving thing", context); 
}); 

SPEC_END 
21

estoy usando Kiwi Library rápida de integrar, funciona bastante bien.

De their github:

describe(@"Team", ^{ 
    context(@"when newly created", ^{ 
     it(@"should have a name", ^{ 
      id team = [Team team]; 
      [[team.name should] equal:@"Black Hawks"]; 
     }); 

     it(@"should have 11 players", ^{ 
      id team = [Team team]; 
      [[[team should] have:11] players]; 
     }); 
    }); 
});