gpt4 book ai didi

ios - 单元测试 Parse 框架 iOS

转载 作者:可可西里 更新时间:2023-11-01 05:29:23 27 4
gpt4 key购买 nike

我正在尝试为使用 Parse 后端框架的 iOS 应用程序编写单元测试,经过大量实验后似乎无法编写成功的单元测试。我找到了一些关于测试异步代码 (Testing asynchronous call in unit test in iOS) 和测试网络调用的帖子,但我还没有找到一种方法来测试使用异步回调对 Parse 后端的调用。

举个例子,谁能建议我如何测试下面这行代码:

[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 注册),只需指定队列即可。这不会死锁主线程,即使处理程序在主线程上显式执行,并且测试也在主线程上运行(由于运行循环机制)。

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

promise 接受超时。如果超时到期,promise 将被“拒绝”(已解决)并出现相应的错误。

IMO,promises 是处理常见异步编程问题的宝贵工具 - 而不仅仅是单元测试的 helper 。 (另请参阅:维基文章 Futures and promises

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

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

关于ios - 单元测试 Parse 框架 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21776943/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com