2012-06-25 5 views
14

私はいくつかの繰り返し仕様を持っています。一般的な機能はブロックbeforeEachに移動することはできません。本質的に、それはオブジェクトの作成であり、12個のオブジェクトのそれぞれに対して4行です。これらの4行を1回の関数呼び出しにしたいと思います。キウイスペックのヘルパー機能

どこでヘルパー機能を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()スコープ上記ストレートC関数を作成することができ

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

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

それとも、いくつかの仕様ファイル間で使用されるヘルパー機能を持っている場合は、別のファイルにこれらの機能を配置し、ヘッダをインポートします。私はこれが私の仕様をクリーンアップするのに最適な方法であることを発見しました。

+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 

最後に、ヘルパーメソッドがanotheに存在する場合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 
関連する問題