unit testingparsing框架iOS

我正在尝试为使用Parse后端框架的iOS应用程序编写unit testing,而且在编写成功的unit testing之后,大量的实验似乎都失败了。 我在testingasynchronous代码( 在iOS中testingunit testing中的asynchronous调用 )和testingnetworking调用方面发现了一些post,但是还没有find用asynchronouscallbacktesting对Parse后端调用的方法。

举个例子,任何人都可以build议我如何testing下面这行代码:

[PFUser saveUser:userModelMock withBlock:^(BOOL success, NSError *error) { }]; 

我正在使用OCMock和XCTest框架。

任何帮助将非常感激。

*编辑*这是我迄今为止,但似乎失败

 - (void)testSaveUser { id userModelMock = [OCMockObject niceMockForClass:[UserModel class]]; id userControllerMock = [OCMockObject niceMockForClass:[self.userController class]]; [[userModelMock expect] saveInBackgroundWithBlock:[OCMArg any]]; [[userControllerMock stub] saveUser:userModelMock withBlock:[OCMArg any]]; [userModelMock verify]; } 

如果您不介意使用第三方库,则可以使用以下方法:

 #import <XCTest/XCTest.h> #import <RXPromise/RXPromise.h> ... @interface PFUserTests : XCTestCase @end @implementation PFUserTests // helper: - (RXPromise*) saveUser:(User*)user { RXPromise* promise = [[RXPromise alloc] init]; [PFUser saveUser:user withBlock:^(Bool success, NSError*error){ if (success) { [promise fulfillWithValue:@"OK"]; } else { [promise rejectWithReason:error]; } }]; return promise; } // tests: -(void) testSaveUser { User* user = ... ; RXPromise* promise = [self saveUser:user]; // set a timeout: [promise setTimeout:5.0]; [promise.thenOn(dispatch_get_main_queue(), ^id(id result) { XCTAssertTrue([result isEqualToString:@"OK"], @""); XCTAssertTrue( ... , @""); return nil; }, ^id(NSError* error) { // this may fail either due to a timeout or when saveUser fails: XCTFail(@"Method failed with error: %@", error); return nil; }) runLoopWait]; // suspend the run loop, until after the promise gets resolved } 

一些注意事项:

您可以在任何队列上执行成功或失败处理程序(使用thenOn语句为promise进行注册),只需指定队列即可。 这并不会死锁主线程,即使处理程序在主线程上显式执行,并且testing也在主线程上运行(感谢运行循环机制)。

runLoopWait方法将进入一个运行循环,只有在promise被parsing后才会返回。 这既有效又高效。

承诺接受超时。 如果超时过期,承诺将被“拒绝”(已解决)并带有相应的错误。

国际海事组织,承诺是一个宝贵的工具来处理常见的asynchronous编程问题 – 不只是unit testing的帮手。 (另见:维基文章期货和承诺 。

请注意,我是RXPromise库的作者,因此我完全有偏见;)

Objective-C还有其他的Promise实现。

原来这只是由于我缺乏对unit testing的理解。 在对模拟对象,存根和类似的东西进行了一些研究之后,

 - (void)testSaveUser { id userModelMock = [OCMockObject mockForClass:[UserModel class]]; id userControllerMock = [OCMockObject partialMockForObject:self.userController]; [[userModelMock expect] saveInBackgroundWithBlock:[OCMArg any]]; [userControllerMock saveUser:userModelMock withBlock:[OCMArg any]]; [userModelMock verify]; } 

使用https://github.com/hfossli/AGAsyncTestHelper/中的macrosWAIT_WHILE(<expression>, <time_limit>) ,您可以编写

 - (void)testSaveUser { __block BOOL saved = NO; [PFUser saveUser:userModelMock withBlock:^(BOOL success, NSError *error) { saved = YES; }]; WAIT_WHILE(!saved, 10.0, @"Failed to save user within 10 seconds timeframe); }