IOS单元测试工具之OCMockito

这里给大家介绍一个新的开源工具OCMockito 下载地址, 我这里通过CocoaPods,导入到我的测试项目中,

#import 

下面是我测试是遇到的第一个问题,给大家来分享下:

//创建mock对象
NSMutableArray *mockArray = mock([NSMutableArray class]);
//使用mock对象
[mockArray addObject:@”one”];
[mockArray removeAllObjects];

//对相关的行为进行验证

[verify(mockArray) addObject:@"one"];
[verify(mockArray) removeAllObjects];

但是却爆出这样的错误
这里写图片描述
这个主要是在编译器设置一下就好了,我用的编译器是Xcode7.2.1,我的设置如下:
IOS单元测试工具之OCMockito_第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 

下面是书上的一些简单的测试代码,下面和大家分享下,大家可以试试哦

 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"是在最后被调用的

这里面的代码我都测试过了,大家如果有遇到什么问题可以和我沟通哦

你可能感兴趣的:(IOS)