我正在尝试使用以下代码进行单元测试。但是,测试只是挂在等待部分。我的测试代码如下。我是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");});
}
答案 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:
fulfill
和waitForExpectationsWithTimeout:
的新方法。
我现在使用这个新的异步测试设备进行了一段时间的单元测试。只是缺少一些功能,例如方法reject
和fulfill
一起使用可选字符串参数进行日志记录。 IMO,它看起来很吸引人,到目前为止效果很好。所以,我真的很鼓励你去看看Xcode测试版;
与此同时,您可能会发现&#34;承诺&#34;适用于实现异步方法测试的库。我已建议在此论坛中多次使用RXPromise库(我是作者)进行单元测试。 ;)
答案 1 :(得分:0)
要在UnitTest中进行异步调用,需要像标志一样。这里讨论的很多: