最近开始在团队中推广单元测试,这边使用的的是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 查看本文章