我最近開始學習Objective-C,並使用與Xcode捆綁在一起的OCUnit編寫我的測試。BDD in Objective-C
我是一個很長時間的Ruby程序員,我習慣於RSpec和黃瓜 - 很好的BDD框架。
在Objective-C中是否有一個體面的BDD框架?我錯過了我的'應該的:)
我最近開始學習Objective-C,並使用與Xcode捆綁在一起的OCUnit編寫我的測試。BDD in Objective-C
我是一個很長時間的Ruby程序員,我習慣於RSpec和黃瓜 - 很好的BDD框架。
在Objective-C中是否有一個體面的BDD框架?我錯過了我的'應該的:)
有一個相對較新的項目叫做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
請記住,我從來沒有使用過它,所以有可能它不會完全符合您的需求。但至少,您可以使用代碼庫作爲編寫您自己的測試框架的靈感。
沒有什麼能阻止你在你的測試方法前加上Should。我在C#中用NUnit做到了這一點。
我所追求的是驗證的特定語法。在Ruby中,它看起來像: method_under_test(args)。should be_valid – 2009-08-23 19:01:26
問這個問題的人在談論Objective-C和OCUnit,它們期望測試方法本身以「test」開始 - 這就是它知道測試方法的方式方法,因爲Objective-C沒有像C#和Java那樣的註釋。 – 2009-09-26 20:16:51
看看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窗口中正確顯示,點擊它會將您帶到測試中失敗的確切位置。
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
我使用Kiwi Library快速整合,效果很好。
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];
});
});
});
您可以在BDD From the idea to the app看看在那裏你會使用蠡看一個例子。
項目似乎很活躍,看起來像我需要的東西。謝謝! – 2009-08-25 11:09:52
謝謝,這是非常好的。 – 2011-04-28 04:11:52