这里给大家介绍一个新的开源工具OCMockito 下载地址, 我这里通过CocoaPods,导入到我的测试项目中,
#import <OCMockito/OCMockito.h>
下面是我测试是遇到的第一个问题,给大家来分享下:
//创建mock对象
NSMutableArray *mockArray = mock([NSMutableArray class]);
//使用mock对象
[mockArray addObject:@”one”];
[mockArray removeAllObjects];
//对相关的行为进行验证
[verify(mockArray) addObject:@"one"];
[verify(mockArray) removeAllObjects];
但是却爆出这样的错误
这个主要是在编译器设置一下就好了,我用的编译器是Xcode7.2.1,我的设置如下:
下面来看看运行效果吧,我们发现运行正常,什么都没有提示,下面我把数据改一下看看
[verify(mockArray) addObject:@"two"];
[verify(mockArray) removeAllObjects];
运行结果如下:
2016-03-02 07:56:59.303 OCMockitoDemo[11900:316147] *** Terminating app due to uncaught exception
'HCGenericTestFailure', reason: '/Users/jack/Desktop/工作中的demo/OCMockitoDemo/OCMockitoDemo/ViewController.m:29: matcher error: Argument(s) are different! Wanted: addObject:"two" Actual invocation has different arguments: addObject:@"one"
------------------------------------------------------------------------
Mismatch in 1st argument. Expected "two", but was "one"
OCMockitoDemo -[ViewController viewDidLoad] + 141
UIKit -[UIViewController loadViewIfRequired] + 1198
UIKit -[UIViewController view] + 27
UIKit -[UIWindow addRootViewControllerViewIfPossible] + 61
UIKit -[UIWindow _setHidden:forced:] + 282
UIKit -[UIWindow makeKeyAndVisible] + 42
UIKit -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4131
UIKit -[UIApplication _runWithMainScene:transitionContext:completion:] + 1760
UIKit -[UIApplication workspaceDidEndTransaction:] + 188
FrontBoardServices -[FBSSerialQueue _performNext] + 192
FrontBoardServices -[FBSSerialQueue _performNextFromRunLoopSource] + 45
CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
CoreFoundation __CFRunLoopDoSources0 + 556
CoreFoundation __CFRunLoopRun + 867
CoreFoundation CFRunLoopRunSpecific + 488
UIKit -[UIApplication _run] + 402
UIKit UIApplicationMain + 171
OCMockitoDemo main + 111'
*** First throw call stack:
(
0 CoreFoundation 0x0000000104269e65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000103ce2deb objc_exception_throw + 48
2 CoreFoundation 0x0000000104269aa9 -[NSException raise] + 9
3 OCMockitoDemo 0x0000000103772f4d -[HCGenericTestFailureReporter executeHandlingOfFailure:] + 93
4 OCMockitoDemo 0x0000000103781362 -[HCTestFailureReporter handleFailure:] + 98
5 OCMockitoDemo 0x0000000103781399 -[HCTestFailureReporter handleFailure:] + 153
6 OCMockitoDemo 0x0000000103781399 -[HCTestFailureReporter handleFailure:] + 153
7 OCMockitoDemo 0x0000000103792624 MKTFailTest + 292
8 OCMockitoDemo 0x00000001037926c3 MKTFailTestLocation + 67
9 OCMockitoDemo 0x0000000103786c99 -[MKTExactTimes verifyData:testLocation:] + 633
10 OCMockitoDemo 0x0000000103784263 -[MKTBaseMockObject verifyInvocation:usingVerificationMode:] + 307
11 OCMockitoDemo 0x00000001037840e9 -[MKTBaseMockObject handlingVerifyOfInvocation:] + 153
12 OCMockitoDemo 0x0000000103783fea -[MKTBaseMockObject forwardInvocation:] + 106
13 CoreFoundation 0x00000001041bf727 ___forwarding___ + 487
14 CoreFoundation 0x00000001041bf4b8 _CF_forwarding_prep_0 + 120
15 OCMockitoDemo 0x000000010376d71e -[ViewController viewDidLoad] + 222
16 UIKit 0x00000001047acf98 -[UIViewController loadViewIfRequired] + 1198
17 UIKit 0x00000001047ad2e7 -[UIViewController view] + 27
18 UIKit 0x0000000104683ab0 -[UIWindow addRootViewControllerViewIfPossible] + 61
19 UIKit 0x0000000104684199 -[UIWindow _setHidden:forced:] + 282
20 UIKit 0x0000000104695c2e -[UIWindow makeKeyAndVisible] + 42
21 UIKit 0x000000010460e663 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4131
22 UIKit 0x0000000104614cc6 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1760
23 UIKit 0x0000000104611e7b -[UIApplication workspaceDidEndTransaction:] + 188
24 FrontBoardServices 0x0000000106fe5754 -[FBSSerialQueue _performNext] + 192
25 FrontBoardServices 0x0000000106fe5ac2 -[FBSSerialQueue _performNextFromRunLoopSource] + 45
26 CoreFoundation 0x0000000104195a31 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
27 CoreFoundation 0x000000010418b95c __CFRunLoopDoSources0 + 556
28 CoreFoundation 0x000000010418ae13 __CFRunLoopRun + 867
29 CoreFoundation 0x000000010418a828 CFRunLoopRunSpecific + 488
30 UIKit 0x00000001046117cd -[UIApplication _run] + 402
31 UIKit 0x0000000104616610 UIApplicationMain + 171
32 OCMockitoDemo 0x000000010376dabf main + 111
33 libdyld.dylib 0x00000001069a592d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
上面把原因说的很清楚咯,嘿嘿,后面我们就可以进行愉快的学习啦。另外说明一下哦,书上的代码还用到了OCHamcrest里面的测试函数,所以要引入这个头文件
#import <OCHamcrest/OCHamcrest.h>
下面是书上的一些简单的测试代码,下面和大家分享下,大家可以试试哦
NSMutableArray *mockArray = mock([NSMutableArray class]);
//使用mock对象
[mockArray addObject:@"one"];
[mockArray removeAllObjects];
//对相关的行为进行验证
[verify(mockArray) addObject:@"two"];
[verify(mockArray) removeAllObjects];
stubing 相关的内容
//建立mock对象
NSArray *mockArray1 = mock([NSArray class]);
//stubing
[given([mockArray1 objectAtIndex:0]) willReturn:@"first"];
//打印得到钢材的stubing
NSLog(@"%@",[mockArray1 objectAtIndex:0]);
//参数的验证
建立mock对象
NSMutableArray *mockArray2 = mock([NSMutableArray class]);
//使用mock对象
[mockArray2 removeObject:@"This is a test!"];
//对相关的参数进行验证
[verify(mockArray2) removeObject:startsWith(@"This is")];
//验证调用关系及被调用到的次数
//创建mock对象
NSMutableArray *mockArray3 = mock([NSMutableArray class]);
//使用mock对象
[mockArray3 addObject:@"once"];
[mockArray3 addObject:@"twice"];
[mockArray3 addObject:@"twice"];
[verify(mockArray3) addObject:@"once"]; //addObject:@"once" 被调用过
[verifyCount(mockArray3, times(1)) addObject:@"once"]; //addObject:@"once"被调用过一次
[verifyCount(mockArray3,times(2)) addObject:@"twice"]; //addObject:@"twice"被调用过2次
[verifyCount(mockArray3, times(3)) addObject:@"twice"]; //addObject:@"twice"被调用过3次
[verifyCount(mockArray3, never()) addObject:@"never happened"]; //addObject:@"never happened"从来没有被调用过
[verifyCount(mockArray3, atLeastOnce()) addObject:@"at least once"]; //addObject:@"at least once"是在最后被调用的
这里面的代码我都测试过了,大家如果有遇到什么问题可以和我沟通哦