2009-08-23 15 views
27

私は最近Objective-Cを学び、XcodeにバンドルされているOCUnitを使ってテストを書いています。Objective-CのBDD

私は長い時間Rubyプログラマーです。私はRSpecとCucumberに慣れています。素敵なBDDフレームワークです。

Objective-Cで使用する適切なBDDフレームワークはありますか?私は私の 'をすべきではありません::)あなたのテストメソッドの接頭辞を止めることは何もありません。

答えて

17

RSpecのテスト用DSLに触発されたuispecという比較的新しいプロジェクトがあります。サンプルの仕様は次のようになります。

#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:@"[email protected]"]; 
    [[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 

私は決してそれを使用していないことに注意してください。あなたのニーズに正確に合致しない可能性があります。しかし、少なくともあなたは、独自のテストフレームワークを書くためのインスピレーションとしてコードベースを使用することができます。

+0

プロジェクトはアクティブで、必要なもののように見えます。ありがとう! –

+0

ありがとう、これは非常にいいです。 –

0

私はC#のNUnitでそれをしました。

+0

私が後にしているのは、検証のための具体的な構文です。 Rubyでは、次のようになります。 method_under_test(args).should be_valid –

+1

質問をしている人は、Objective-CとOCUnitについて、テストメソッド自体が "test"で始まることを期待しています。つまり、どのメソッドがテストであるかを知る方法ですObjective-CにはC#やJavaなどのアノテーションはありません。 –

8

STAssert OCUnit(SenTestingKit、Xcodeに含まれています)のマクロがどのように実装されているかを見てください。

ユニットテストバンドルでは、NSObjectにカテゴリを実装して、-shouldBeValidのようなメソッドを追加し、今度はSTAssertマクロと同じ合格/失敗の機種を呼び出すことができます。あなたがCプリプロセッサと密接に慣れていない場合は

...

あなたはおそらくも__FILE____LINE__あなたのBDDのテストのために正しい値を通過するように、あなたのマクロの#defineを使用する必要があります失敗します。

[[someObject methodUnderTest:argument] shouldBeValidInFile:__FILE__ line:__LINE__]; 
:コンパイラは、見ているコードは、このなります

[[someObject methodUnderTest:argument] shouldBeValid]; 

:あなたはこのようにそれを呼び出します。そのように

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

#define shouldBeValid shouldBeValidInFile:__FILE__ line:__LINE__ 

:たとえば、あなたはこのような何かをする必要がある場合があります

__FILE____LINE__のプリプロセッサマクロは、テストソースファイル内の現在のファイルと行に展開されます。

このようにして、失敗したテストがある場合、適切な情報をSenTestingKitに渡してXcodeに送り返すことができます。失敗は[Build Results]ウィンドウに正しく表示され、クリックするとテストの失敗の正確な場所に移動します。

14

Pivotal LabsのAdam Milliganは、Objective-C用のBDDフレームワークを作成しました。Cedarは、CocoaとCocoa Touchの両方を対象としています。 RSpecと同様の方法でブロックを使用します。 、私は統合するクイックKiwi Libraryを使用してい

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 
21

かなりうまく機能:ここでは例の仕様です。their 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]; 
     }); 
    }); 
}); 
関連する問題