45 votes

dispatch_sync sur la file d'attente principale se bloque dans le test unitaire

J'avais du mal à tester un grand code de répartition central avec le framework de test unitaire Xcode intégré, SenTestingKit. J'ai réussi à faire bouillir mon problème fait à cela. J'ai un test unitaire qui construit un bloc et essaie de l'exécuter sur le thread principal. Cependant, le bloc n'est jamais réellement exécuté, donc le test se bloque car il s'agit d'un envoi synchrone.

 - (void)testSample {

    dispatch_sync(dispatch_get_main_queue(), ^(void) {
        NSLog(@"on main thread!");
    });

    STFail(@"FAIL!");
}

Qu'est-ce qui provoque ce blocage dans l'environnement de test ?

6voto

NJones Points 20265

Si vous êtes dans la file d'attente principale et que vous attendez de manière synchrone que la file d'attente principale soit disponible, vous attendrez en effet longtemps. Vous devriez tester pour vous assurer que vous n'êtes pas déjà sur le fil principal.

2voto

codebaboon Points 16

A suivre, puisque

 dispatch_get_current_queue()

est désormais obsolète, vous pouvez utiliser

 [NSThread isMainThread]

pour voir si vous êtes sur le fil principal.

Donc, en utilisant l'autre réponse ci-dessus, vous pouvez faire :

 - (void)testSample 
{
    BOOL __block didRunBlock = NO;
    void (^yourBlock)(void) = ^(void) {
        NSLog(@"on main queue!");
        didRunBlock = YES;
    };

    if ([NSThread isMainThread])
        yourBlock();
    else
        dispatch_sync(dispatch_get_main_queue(), yourBlock);

    STAssertEquals(YES, didRunBlock, @"FAIL!");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X