2012-06-25 11 views
14

Mam kilka powtarzalnych specyfikacji, które chciałbym OSUSZCZYĆ. Wspólna funkcjonalność nie pozwala na przejście do bloku beforeEach. Zasadniczo jest to tworzenie obiektu i 4 linie dla każdego z 12 obiektów, chciałbym przekształcić te 4 linie w jedno wywołanie funkcji.Funkcje pomocnicze w specyfikacji Kiwi

Gdzie mogę umieścić funkcje pomocnicze w specyfikacji Kiwi?

W RSpec mogę po prostu wstawić def między blokami specyfikacji, ale tutaj nie wydaje się to możliwe. Próbowałem nawet pomijając makro SPEC_END i sam je dodając, abym mógł dodać funkcje wewnątrz @implementation z SPEC_BEGIN, ale to też nie działa.

Korekta ... Potrafię zarządzać czymś podobnym przy ręcznym kodowaniu makra SPEC_END. Miałem koniec} źle umieszczone. Ale nadal się nie powiedzie, ponieważ metoda ta nie znajduje się w @interface.

+1

zobaczyć ten https://github.com/kiwi-bdd/Kiwi/issues/138 – onmyway133

Odpowiedz

33

Stwórz swoją funkcję pomocnika w postaci bloku tuż po 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 przydatne! Wielkie dzięki. – bearMountain

+0

Czy można mieć pomocnika asynchronicznego? Powiedzmy, że jeśli chciałbym uwierzytelnić się na zdalnym serwerze w pomocniku. – pshah

8

Można również stworzyć prostą funkcję C powyżej zakresu SPEC_BEGIN().

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

Lub jeśli masz pomocnicze funkcje, które będą wykorzystywane w kilku plików Spec, umieść te funkcje w osobnym pliku i zaimportować nagłówek. Odkryłem, że to świetny sposób na wyczyszczenie moich specyfikacji.

+0

Mogę przysiąc, że próbowałem tego, ale nie wiem już tego na pewno. Będę musiał wrócić i to sprawdzić. To mniej więcej to, czego chciałem. – Otto

+0

To daje mi następujące ostrzeżenie: ostrzeżenie: brak poprzedni prototyp funkcji ' function' [-Wmissing-prototypy] ten może być rozwiązany poprzez metodę statyczną: statyczny NSString * makeAString() { ...} –

+0

@SebastienMartin Nigdy nie widziałem tego błędu. Czy deklarujesz funkcję przed jej użyciem? – bearMountain

5

supermarin sugeruje następującą metodę:

@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 

Inną opcją jest 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 

Dobrą rzeczą jest to, że nadaje się dobrze do asynchronicznych scenariuszy:

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 

Wreszcie, jeśli Twoja metoda pomocy znajduje się w Klasa R, gantaa sugeruje sprytny 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 
Powiązane problemy