【发布时间】:2014-08-15 17:40:47
【问题描述】:
我正在尝试使用以下代码进行单元测试。但是,测试只是挂在等待部分。我的测试代码如下。我是 iOS 和 AFNetworking 的新手。任何帮助将不胜感激。
我知道的事情: 正在调用 USAPIConnection 中的方法。 在 TestController 上没有调用成功或失败方法。 对 rails api 的请求正在运行。 (我知道它会返回 200 OK 代码)。
我不知道的事情: AFHTTPRequestOperationManager 实际上是在发送请求吗? 为什么没有成功发送失败方法? 这个单元测试是否足以进行测试?
XC测试代码
#import <XCTest/XCTest.h>
#import "USAPIConnection.h"
#import "Controller.h"
@interface TestController : NSObject <Controller>
@property bool done;
@end
@implementation TestController
-(void)asynchronousSuccessfulWithObject:(id)object type:(int)type{
NSLog(@"Object: %@", object);
XCTAssertNotNil(object,"@Should have returned JSON object: %s",__PRETTY_FUNCTION__);
_done = true;
}
-(void)asynchronousUnsuccessfulWithError:(NSError *)error type:(int)type{
XCTFail(@"Unsuccessful async call with error%s: %s",error,__PRETTY_FUNCTION__);
_done = true;
}
@end
@interface USAPIConnectionTests : XCTestCase
@end
@implementation USAPIConnectionTests
- (void)setUp
{
[super setUp];
NSLog(@"Beginning Test: %s",__PRETTY_FUNCTION__);
}
- (void)tearDown
{
NSLog(@"Ending Test: %s",__PRETTY_FUNCTION__);
[super tearDown];
}
- (void)testGetTeamById
{
TestController* testController = [[TestController alloc] init];
testController.done = false;
[USAPIConnection getTeamById:1 controller:testController];
int count = 0;
while(!testController.done && count < 10){
//Waiting
[NSThread sleepForTimeInterval:3.0];
count = count + 1;
}
if(count == 10){
XCTFail(@"Timed out: %s",__PRETTY_FUNCTION__);
}
}
@end
USAPIConnection 中调用的方法
+(void)getTeamById:(int)identity controller:(id<Controller>)controller{
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONResponseSerializer* serializer = [AFJSONResponseSerializer serializer];
serializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
manager.responseSerializer = serializer;
[manager POST:[NSString stringWithFormat:@"http://%@/team/%D",baseURL,identity] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
[controller asynchronousSuccessfulWithObject:responseObject type:TYPETEAMSBYNAME];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
[controller asynchronousUnsuccessfulWithError:error type:TYPETEAMSBYNAME];
}];
}
尝试
尝试将测试方法更改为以下。但是,测试控制器中的 NSLog 都没有运行。
- (void)testGetTeamById
{
TestController* testController = [[TestController alloc] init];
testController.done = false;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{[USAPIConnection getTeamById:1 controller:testController];});
//dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{NSLog(@"HELLO FROM ASYNC QUEUE");});
}
【问题讨论】:
-
如果我错了,请纠正我,但是主线程不会在任何地方等待,所以当应该调用
asynchronousSuccessfulWithObject时,程序已经不再运行了 -
@toasted_flakes 这是通过测试运行的,所以当测试 testGetTeamById 运行时,while 循环有一个短暂的等待,直到完成或大约 30 秒过去。
-
错误可能仍然来自那里,因为在 XCTest 中没有运行循环。要调试 XCTest 的异步行为,您可以从运行虚拟块开始,而不是使用 AFNetworking。类似于
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"Hello from async queue"); }); -
@toasted_flakes 我不确定那会完成什么。你能进一步解释一下吗?
-
如果我对 XCTest 框架的理解是正确的,
NSLog将无法运行,因为缺少适当的NSRunLoop或等效项。然后我们就可以排除AFNetworking具体使用中的任何错误
标签: ios objective-c unit-testing afnetworking afnetworking-2