最近開始在團隊中推廣單元測試,這邊使用的的是Kiwi測試框架。詳細教程大家可以參考下方三篇文章
https://www.jianshu.com/p/ad55e197a8d3
https://onevcat.com/2014/02/ios-test-with-kiwi/
https://onevcat.com/2014/05/kiwi-mock-stub-test/
單元測試不僅要對正常的情況進行測試,對於異常的情況也需要進行測試,上面三篇文章中,關於NSExceoption測試,上面的博客中已經有示例代碼,具體如下
待測試代碼:
- (double)pop {
if ([self count] == 0) {
[NSException raise:@"VVStackPopEmptyException" format:@"Can not pop an empty stack."];
}
double result = [self top];
[self.numbers removeLastObject];
return result;
}
測試代碼:
it(@"should raise a exception when pop", ^{
[[theBlock(^{
[stack pop];
}) should] raiseWithName:@"VVStackPopEmptyException"];
});
如果出現異常,我們能夠順利捕獲,那麼測試就順利通過。我們在項目中經常會使用斷言,對於斷言能否進行單元測試驗證呢,我這邊試了一下還是可以的,不過需要注意一些要點。測試代碼如下:
待測試代碼
- (void)setNewName
{
NSAssert(NO, @"setNewName failed");
#warning todo
// ......
}
[[[person setNewName] should] raiseWithName:@"setNewName"];
注:方法名字setNewName
要和raiseWithName方法的參數保持一致。
如果一個方法內有多個斷言,那麼我們還要根據reason進行區分。
待測試代碼如下:
- (void)setNewName
{
NSAssert(NO, @"setNewName failed");
#warning todo
// ......
NSAssert(NO, @"setNewName failed_1");
}
測試代碼如下:
[[[person setNewName] should] raiseWithName:@"setNewName" reason:@"setNewName failed"];
[[[person setNewName] should] raiseWithName:@"setNewName" reason:@"setNewName failed_1"];
注:斷言的desc就是reason的內容。
但是在實踐過程中發現如果一個一個函數沒有返回值,直接使用下面的測試樣例是不行的
[[[person setNewName] should] raiseWithName:@"setNewName" reason:@"setNewName failed"];
此時需要將該函數放在block內,類似下面這樣
it(@"should raise a exception when pop", ^{
[[theBlock(^{
[stack pop];
}) should] raiseWithName:@"VVStackPopEmptyException"];
});
爲了簡單好用,我這邊統一將函數放在了block內,來驗證斷言
更多優質文章,可以微信掃碼關注: