2012-06-25 58 views
14

我有幾個重複的規格,我想幹掉。通用功能不適用於移動到beforeEach區塊。從本質上講,它是對象創建,對於12個對象中的每一個都是4行,我想將這4行變成單個函數調用。獼猴桃規格中的助手功能

我在哪裏可以將輔助函數放入Kiwi規範中?

在RSpec中,我可以在規範塊之間放置def,但在這裏看起來不太可能。我甚至嘗試跳過SPEC_END宏,並自己添加該內容,所以我可以在@implementation中添加函數,從SPEC_BEGIN,但似乎並沒有工作。

更正 ...我可以管理一些手工編碼SPEC_END宏。我最終錯位了。但仍然失敗,因爲該方法不在@interface中。

+1

看到這個https://github.com/kiwi-bdd/Kiwi/issues/138 – onmyway133

回答

33

只是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

超級有用!非常感謝。 – bearMountain

+0

是否有可能擁有一個異步幫助器?假設我想在助手中使用遠程服務器進行身份驗證。 – pshah

8

您還可以創建上面的SPEC_BEGIN()範圍直C函數。

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

或者如果您有跨多個Spec文件使用的幫助函數,請將這些函數放在單獨的文件中並導入標題。我發現這是清理我的規格的好方法。

+0

我可以發誓我嘗試過,但我不知道肯定了。我將不得不回去看看。這或多或少是我想要的。 – Otto

+0

這使我以下警告: 警告:沒有先前的原型函數「<函數名>」 [-Wmissing的原型] 這可以通過使該方法靜態解決: 靜態的NSString * makeAString(){ ...} –

+0

@SebastienMartin我從來沒有見過這個錯誤。你在使用它之前是否聲明瞭這個函數? – bearMountain

5

supermarin提出以下方法:

@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 

另一種選擇是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 

關於它的好處是,它更傾向於很好地到異步場景:

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 

最後,如果你的幫手方法駐留在其他R類別,gantaa提出一個聰明的黑客:

@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 
相關問題