iOS單元測試拾遺(一)

  最近開始在團隊中推廣單元測試,這邊使用的的是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內,來驗證斷言

更多優質文章,可以微信掃碼關注:
這裏寫圖片描述

發佈了231 篇原創文章 · 獲贊 111 · 訪問量 61萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章