2012-06-25 18 views
14

Ich habe ein paar repetitive Angaben, die ich gerne trocknen würde. Die allgemeine Funktionalität eignet sich nicht dazu, sich in einen beforeEach Block zu bewegen. Im Wesentlichen ist es Objekt-Erstellung und ist 4 Zeilen für jedes der 12 Objekte, ich möchte diese 4 Zeilen in einen einzigen Funktionsaufruf machen.Helfer Funktionen in Kiwi specs

Wo kann ich Hilfsfunktionen in eine Kiwi-Spezifikation einfügen?

In RSpec kann ich def zwischen Spezifikationsblöcke setzen, aber das scheint hier nicht möglich zu sein. Ich habe sogar versucht, das SPEC_END Makro zu überspringen und diesen Inhalt selbst hinzuzufügen, also könnte ich Funktionen innerhalb der @ Implementierung von SPEC_BEGIN hinzufügen, aber das scheint auch nicht zu funktionieren.

Korrektur ... Ich kann etwas, das mit der Hand-Codierung der SPEC_END Makro funktioniert. Ich hatte das Ende} falsch platziert. Aber immer noch, es scheitert, weil die Methode nicht in der @interface ist.

+1

sehen diese https://github.com/kiwi-bdd/Kiwi/issues/138 – onmyway133

Antwort

33

Erstellen Sie Ihre Hilfsfunktion als Block unmittelbar nach dem 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 nützlich! Danke vielmals. – bearMountain

+0

Ist es möglich, einen asynchronen Helfer zu haben? Nehmen wir an, ich möchte mich mit einem Remote-Server im Helper authentifizieren. – pshah

8

Sie auch eine gerade C-Funktion über den SPEC_BEGIN() Umfang schaffen könnte.

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

Oder wenn Sie Hilfsfunktionen haben, die sich über mehrere Spec-Dateien verwendet werden, um diese Funktionen in einer separaten Datei platzieren und den Header importieren. Ich habe festgestellt, dass dies eine großartige Möglichkeit ist, meine Spezifikationen zu bereinigen.

+0

Ich könnte schwören, ich habe das versucht, aber ich weiß es nicht mehr sicher. Ich werde zurückgehen und es überprüfen müssen. Das ist mehr oder weniger das, was ich wollte. – Otto

+0

Das gibt mir die folgende Warnung: Warnung: keine vorherigen Prototyp für die Funktion '' [-Wmissing-Prototypen] Dies kann durch die Methode statisch gelöst werden: statische NSString * makeAString() { ...} –

+0

@SebastienMartin Ich habe diesen Fehler nie gesehen. Deklarieren Sie die Funktion, bevor Sie sie verwenden? – bearMountain

5

supermarin schlägt die folgende Methode:

@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 

Eine weitere Option ist als 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 

Das Schöne daran ist, dass es sich schön zu Asynchron-Szenarien verleiht:

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 

Schließlich, wenn Ihre Helfer-Methode in einem anderen befindet r Klasse, gantaa schlägt einen cleveren Hack:

@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