0

コードで単体テストを実行しようとしています。問題に直面しています。単体テスト関数は、非同期要求が完了するのを待っていません。実行時ではなく、テスト中の場合にのみ待ちたいと思います。

これを確認する方法を見つけました:

if([[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"] isEqualToString:@"TEST"])

私のプロジェクトで設定されたそれぞれの環境変数を使用して。しかし、私はそれを待つ適切な方法を見つけることができません。私はセマフォを試してみましたが、それはうまくいきましたが、もっと簡単で読みやすい方法が他にないかどうか迷っています。

編集 :

最後に、私はこのようにしました:私はもっと良いことができたと思いますが、それは機能し、私には十分に公平に見えます.

static int statusCode;

- (void)requestContent:(NSString*)urlString
{
statusCode = 0;
NSLog(@"Request Content");
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                                                    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
{
    [self ParseGoogleImageSearchResponse:JSON];
    statusCode = 1;
    NSLog(@"Done");
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
{
    NSLog(@"%@", [error userInfo]);
    statusCode = 2;
}];
[operation start];

if([[[[NSProcessInfo processInfo] environment] objectForKey:@"TARGET"] isEqualToString:@"TEST"])
{
    while(statusCode == 0)
    {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate date]];
        NSLog(@"WAITING");
    }
}
}
4

1 に答える 1

0

AFNetworking 呼び出しの非同期単体テストを実行する 1 つの方法は、GHUnit を使用することです

GHUnit は、ランループの回転と非同期操作の終了の待機を自動的に処理するため、単体テスト コードがはるかに読みやすくなります。

これは、AFNetworking、GHUnit、およびCocoaPodsをすべて一緒に使用する方法をカバーする基本的なチュートリアルです。

これは、AFNetworking と GHUnit を使用して作成された基本的なテストです。

- (void)test
{
    [self prepare];

    __block NSError     *responseError  = nil;
    __block id          resposeObject   = nil;

    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                                                        success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
    {
        resposeObject = JSON;       
        [self notify:kGHUnitWaitStatusSuccess forSelector:_cmd];
    }
    failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
    {
        responseError = error       
        [self notify:kGHUnitWaitStatusSuccess forSelector:_cmd];
    }];
    [operation start];

    // Wait for the async activity to complete
    [self waitForStatus:kGHUnitWaitStatusSuccess timeout:kNetworkTimeout];

    // Check Error
    GHAssertNil(responseError, @"");
    GHAssertNotNil(resposeObservation, @"Response Observation is nil");

    // Validate data...
}

それが役立つことを願っています!

于 2013-04-22T22:06:55.973 に答える