AFNetworking Unit测试

时间:2014-08-15 17:40:48

标签: ios objective-c unit-testing afnetworking afnetworking-2

我正在尝试使用以下代码进行单元测试。但是,测试只是挂在等待部分。我的测试代码如下。我是iOS和AFNetworking的新手。任何帮助将不胜感激。

我知道的事情: 正在调用USAPIConnection中的方法。 在TestController上没有调用成功或失败方法。 对rails api的请求正在运行。 (我知道它会返回200 OK代码)。

我不知道的事情: AFHTTPRequestOperationManager实际上是在发送请求吗? 为什么发送失败方法没有成功? 该单元测试是否足以进行测试?

XCTest代码

#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");});
}

2 个答案:

答案 0 :(得分:4)

Xcode 6中的XCTest(在撰写本文时尚未发布)支持异步方法的测试。

这里是Swift中的一个小片段,展示了它的外观:

假设您有一个带有完成函数的异步方法作为参数:

func doSomethingAsync(completion:(result: Int?, error: Int?) -> ())

现在,您要测试此异步函数是否成功执行,或者您想要测试在continuation(完成处理程序)中定义的某些代码:

func testAsyncFunction() {
    let expect = self.expectationWithDescription("completion handler called")
    doSomethingAsync { (result, error) -> () in
        if let value = result? {
            println("Result: \(value)")
        }
        else {
            println("Error: \(error!)")
        }
        expect.fulfill()
    }
    waitForExpectationsWithTimeout(1000, handler: nil)
}

您可以在XCTest的标题中详细了解XCTest self.expectationWithDescription: fulfillwaitForExpectationsWithTimeout:的新方法。

我现在使用这个新的异步测试设备进行了一段时间的单元测试。只是缺少一些功能,例如方法rejectfulfill一起使用可选字符串参数进行日志记录。 IMO,它看起来很吸引人,到目前为止效果很好。所以,我真的很鼓励你去看看Xcode测试版;

与此同时,您可能会发现&#34;承诺&#34;适用于实现异步方法测试的库。我已建议在此论坛中多次使用RXPromise库(我是作者)进行单元测试。 ;)

答案 1 :(得分:0)

要在UnitTest中进行异步调用,需要像标志一样。这里讨论的很多:

How to unit test asynchronous APIs?