IOS 下自动化测试框架 GHUnit 和 OCMock 初探 [二]
2013-06-04 18:27
399 查看
在 上一篇中已经介绍了GHUnit。GHUnit和OCUnit使用上基本上一致,但是他提供了更多的feature。同时,结果展示上更友好。
不管是系统自带的OCUnit还是GHUnit,基本上都不支持Mock,OCMock就是一个开源的ObjC的Mock库。很多时候,GHUnit和OCMock经常一起使用的。
首先我们先来了解下OCMock库。
OcMock 官方网站:http://ocmock.org/
OCMock是为了某些不容易构造或者不用一获取的对象,用一个虚拟的对象来创建以便测试。可以虚拟返回,虚拟调用等。接下来我们看看OCMock到底是个什么东东。
类Mock:创建一个类的Mock 对象
期望(expect)和验证(verify)
mock 对象的指定方法指定参数的函数被调用。mock Verify 后 相当于 Mock的 Class 的实例instance调用了
[instance someMethod:someArgument].
很简单,对吧。不过mock主要还是用到stub模式,相当于创建了一个类的虚拟实例。基于这个实例我们可以:
<
b4bc
/span>
基于参数的mock:
基于参数主要是为了解决一些边界测试,测试API的接口健壮性。
OCMock也支持 Protocol的mock
OCMock还支持实例化后对象的Mock
Observer模式的Mock
更多关于OCMock的知识请参考官网,最好结合例子看。
OCMock的集成很简单。IOS上是通过静态库的方式。将.a文件和相应的.h文件加入工程设置中。同时添加other link flag:
本篇完,下一节我通过一个例子来展示GHUnit和OCMock
不管是系统自带的OCUnit还是GHUnit,基本上都不支持Mock,OCMock就是一个开源的ObjC的Mock库。很多时候,GHUnit和OCMock经常一起使用的。
首先我们先来了解下OCMock库。
OcMock 官方网站:http://ocmock.org/
OCMock是为了某些不容易构造或者不用一获取的对象,用一个虚拟的对象来创建以便测试。可以虚拟返回,虚拟调用等。接下来我们看看OCMock到底是个什么东东。
类Mock:创建一个类的Mock 对象
id mock = [OCMockObject mockForClass:[SomeClass class]]
期望(expect)和验证(verify)
[[mock expect] someMethod:someArgument]
[mock verify]
mock 对象的指定方法指定参数的函数被调用。mock Verify 后 相当于 Mock的 Class 的实例instance调用了
[instance someMethod:someArgument].
很简单,对吧。不过mock主要还是用到stub模式,相当于创建了一个类的虚拟实例。基于这个实例我们可以:
[[[mock stub] andReturn:aValue] someMethod:someArgument] // 调用指定方法,指定参数,并返回固定值 aValue;
[[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})] someMethod:someArgument] // 同上,返回OCMock定义的数据类型 BOOL
[[mock stub] someMethodWithReferenceArgument:[OCMArg setTo:anObject] // 指定一个对象最为参数,并执行somemethod
[[mock stub] someMethodWithReferenceArgument:[OCMArg setToValue:OCMOCK_VALUE((int){aValue}) // 同上
[[[mock stub] andThrow:anException] someMethod:someArgument] //调用方法,并抛出指定异常
[[[mock stub] andPost:aNotification] someMethod:someArgument] //调用方法,并发送一个通知
[[[[mock stub] andPost:aNotification] andReturn:aValue] someMethod:someArgument] //调用方法,结束后返回一个aValue并同时发送一个Notication。
[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument] //同上,由notificaiton变为直接执行某个方法
void (^theBlock)(NSInvocation *) = ^(NSInvocation *invocation) { /* code that reads and modifies the invocation object */ }; [[[mock stub] andDo:theBlock] someMethod:[OCMArg any]]; // 调用方法后,异步执行一个Block
<
b4bc
/span>
[[[mock expect] andForwardToRealObject] someMethod]
基于参数的mock:
[[mock expect] someMethodWithPointerArgument:[OCMArg anyPointer]]
[[mock expect] someMethod:[OCMArg isNil]]
[[mock expect] someMethod:[OCMArg isNotNil]]
[[mock expect] someMethod:[OCMArg isNotEqual:aValue]]
[[mock expect] someMethod:[OCMArg checkWithSelector:aSelector onObject:anObject]]
[[mock expect] someMethod:[OCMArg checkWithBlock:^BOOL(id value) { /* return YES if value is ok */ }]];
[[mock expect] someMethod:startsWith(@"foo")]
基于参数主要是为了解决一些边界测试,测试API的接口健壮性。
OCMock也支持 Protocol的mock
id aMock = [OCMockObject mockForProtocol:@protocol(SomeProtocol)]
OCMock还支持实例化后对象的Mock
id aMock = [OCMockObject partialMockForObject:anObject]
Observer模式的Mock
id aMock = [OCMockObject observerMock]
[notificatonCenter addMockObserver:aMock name:SomeNotification object:nil]
[[mock expect] notificationWithName:SomeNotification object:[OCMArg any]]
更多关于OCMock的知识请参考官网,最好结合例子看。
OCMock的集成很简单。IOS上是通过静态库的方式。将.a文件和相应的.h文件加入工程设置中。同时添加other link flag:
本篇完,下一节我通过一个例子来展示GHUnit和OCMock
相关文章推荐
- IOS 下自动化测试框架 GHUnit 和 OCMock 初探 [二]
- IOS 下自动化测试框架 GHUnit 和 OCMock 初探 [一]
- IOS 下自动化测试框架 GHUnit 和 OCMock 初探 [一]
- Cocoapods + GHUnit + OCMock 实现iOS单元测试
- iOS单元测试GHUnit + OCMock(不使用cocoapods版)
- XCode 内置了 OCUnit 单元测试框架,但目前最好用的测试框架应该是 GHUnit。通过 GHUnit + OCMock 组合,我们可以在 iOS 下进行较强大的单元测试功能。本文将演示如何在
- iOS单元测试GHUnit + OCMock(使用cocoapods版)
- OCUnit和GHUnit和OCMock
- 教程:在iOS项目里面集成使用GHUnit。
- 利用GHUnit编写iOS单元测试
- ios单元测试之GHUnit
- ios单元測试之GHUnit
- GHUnit使用指南(翻译自GitHub)-IOS测试框架
- Xcode 5 单元测试(二)OCMock和GHUnit
- iOS GHUnit输出Junitxml格式log(为后续的hudson的整合做基础)
- IOS GHUnit常见错误信息
- Xcode 5 单元测试(二)OCMock和GHUnit
- iOS测试-GHUnit配置
- GHUnitIOS.framework 下载 地址
- Xcode6下iOS单元测试——XCTest和GHUnit框架简介和比较