2009-08-23 100 views
27

我最近開始學習Objective-C,並使用與Xcode捆綁在一起的OCUnit編寫我的測試。BDD in Objective-C

我是一個很長時間的Ruby程序員,我習慣於RSpec和黃瓜 - 很好的BDD框架。

在Objective-C中是否有一個體面的BDD框架?我錯過了我的'應該的:)

回答

17

有一個相對較新的項目叫做uispec,它受RSpec測試DSL的啓發。示例規範如下所示:

#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

項目似乎很活躍,看起來像我需要的東西。謝謝! – 2009-08-25 11:09:52

+0

謝謝,這是非常好的。 – 2011-04-28 04:11:52

0

沒有什麼能阻止你在你的測試方法前加上Should。我在C#中用NUnit做到了這一點。

+0

我所追求的是驗證的特定語法。在Ruby中,它看起來像: method_under_test(args)。should be_valid – 2009-08-23 19:01:26

+1

問這個問題的人在談論Objective-C和OCUnit,它們期望測試方法本身以「test」開始 - 這就是它知道測試方法的方式方法,因爲Objective-C沒有像C#和Java那樣的註釋。 – 2009-09-26 20:16:51

8

看看OCUnit中的STAssert宏(SencodeestKit,包含在Xcode中)是如何實現的。

在您自己的單元測試包中,您可以在NSObject上實現一個類別,以添加類似假設的-shouldBeValid的方法,然後調用與STAssert宏相同的通過/失敗機制。

如果你不是十分熟悉的C預...

你可能還需要使用您的宏的#define通過正確的價值觀以通爲__FILE____LINE__當你的BDD測試失敗。例如,你可能需要做這樣的事情:

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

#define shouldBeValid shouldBeValidInFile:__FILE__ line:__LINE__ 

這樣,你會調用它是這樣的:

[[someObject methodUnderTest:argument] shouldBeValid]; 

的代碼編譯器看到的將是這樣的:

[[someObject methodUnderTest:argument] shouldBeValidInFile:__FILE__ line:__LINE__]; 

__FILE____LINE__預處理器宏將擴展爲測試源文件中的當前文件和行。

這樣,當你有一個失敗的測試,它可以傳遞適當的信息SenTestingKit發送回Xcode。失敗將在Build Results窗口中正確顯示,點擊它會將您帶到測試中失敗的確切位置。

14

Pivotal Labs的Adam Milligan爲Objective-C創建了一個名爲Cedar的BDD框架,該框架既面向Cocoa也面向Cocoa Touch。它以與RSpec類似的方式使用塊。這裏有一個例子說明:

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

我使用Kiwi Library快速整合,效果很好。

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]; 
     }); 
    }); 
});