Domanda

Di recente ho iniziato ad imparare Objective-C e scrivere i miei test utilizzando OCUnit fornito in dotazione con Xcode.

Sono un lungo periodo di tempo programmatore Ruby e io sono abituato a RSpec e cetriolo - bei quadri BDD

.

C'è un quadro BDD decente per utilizzare in Objective-C? Mi manca il mio 'dovrebbe è:)

È stato utile?

Soluzione

C'è un relativamente nuovo progetto chiamato uispec che è stato ispirato da DSL test di RSpec. L'esempio spec si presenta così:

#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:@"b@g.com"];
  [[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

Tenete a mente che non ho mai usato, quindi c'è una possibilità che non si adatta alle vostre esigenze esattamente. Ma per lo meno, sarete in grado di utilizzare il codice di base come ispirazione per la scrittura del proprio framework di test.

Altri suggerimenti

Kiwi Biblioteca rapida per integrare, funziona piuttosto bene.

loro 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];
        });
    });
});

Adam Milligan di Pivotal Labs ha creato un quadro BDD per Objective-C chiamato Cedar che gli obiettivi sia di cacao e Cocoa touch. Esso utilizza i blocchi in modo simile a RSpec. Ecco una specifica esempio:

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

Date un'occhiata a come le macro STAssert in OCUnit (SenTestingKit, inclusi con Xcode) siano applicate.

Nel vostro pacco test di unità, è possibile implementare una categoria a NSObject per aggiungere metodi come un ipotetico -shouldBeValid che avrebbe poi chiamare lo stesso pass / fail macchinari che le macro STAssert fanno ora.

Nel caso in cui non siete intimamente familiare con il preprocessore C ...

Probabilmente dovrete anche utilizzare un #define per le macro di passare attraverso i giusti valori per __FILE__ e __LINE__ quando i test BDD sicuro. Ad esempio, si potrebbe fare qualcosa di simile:

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

#define shouldBeValid  shouldBeValidInFile:__FILE__ line:__LINE__

In questo modo si sarebbe richiamare in questo modo:

[[someObject methodUnderTest:argument] shouldBeValid];

Il codice del compilatore vede sarà questo:

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

I __FILE__ e __LINE__ macro del preprocessore si espanderà al file corrente e riga nel file sorgente di test.

In questo modo, quando si ha una prova in mancanza, può passare informazioni appropriate per SenTestingKit di rimandare in Xcode. Il fallimento verrà visualizzato correttamente nella finestra Costruire risultati, e clic su di esso vi porterà alla posizione esatta del fallimento nei test.

Si può dare un'occhiata a BDD dall'idea al applicazione dove vedrete un esempio con zucca.

Non c'è niente di arresto si anteponendo il tuo metodo di prova con dovrebbe. L'ho fatto con NUnit in C #.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top