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内,来验证断言

更多优质文章,可以微信扫码关注:
这里写图片描述

扫描二维码关注公众号,回复: 8836235 查看本文章
发布了231 篇原创文章 · 获赞 110 · 访问量 60万+

猜你喜欢

转载自blog.csdn.net/HHL110120/article/details/103449273