2015-11-18 2 views
1

Voici comment mon test ressemble à:OCMArg checkWithBlock se bloque avec EXC_BAD_ACCESS

// In setUp: 
self.APIClientMock = OCMClassMock([APIClient class]); 
OCMStub([self.APIClientMock sharedClient]).andReturn(self.APIClientMock); 

// In test method: 
OCMVerify([self.APIClientMock POST:@"invitations" parameters:[OCMArg checkWithBlock:^BOOL(NSDictionary *parameters) { 
    // Some parameters check is supposed to be here, but even simply returning YES doesn't work... 
    return YES; 
}] success:[OCMArg any] failure:[OCMArg any]]); 

APIClient est une sous-classe de AFHTTPSessionManager (de AFNetworking).

Chaque fois que ce test est exécuté il y a une erreur EXC_BAD_ACCESS comme ceci:

EXC_BAD_ACCESS (code=1, address=0x7a0090020) 

Franchement, je ne suis pas particulièrement connu des erreurs de débogage EXC_BAD_ACCESS, et le message d'erreur ne semble pas être très utile

Aussi, l'étrange c'est que cela se produit uniquement lorsque j'utilise le POST:parameters:success:failure:, mais pas avec son homologue GET (qui a exactement les mêmes paramètres).

Cela peut-il me poser un problème dans AFNetworking?

EDIT:

Activés objets Zombie pour le test, ceci est le résultat:

*** -[__NSDictionaryI retain]: message sent to deallocated instance 0x7fbd8306f280 

EDIT 2:

Je réduit mon cas de test pour le code suivant qui a toujours reproduit le crash:

#import <AFNetworking.h> 
#import <OCMock/OCMock.h> 
#import <XCTest/XCTest.h> 

@interface ExampleTests : XCTestCase 

@end 

@implementation ExampleTests 

- (void)sendRequesUsingSessionManager:(AFHTTPSessionManager *)sessionManager { 
    NSDictionary *parameters = @{@"param": @"value"}; 
    [sessionManager POST:@"test" parameters:parameters success:nil failure:nil]; 
} 

- (void)testExample { 
    id sessionManagerMock = OCMClassMock([AFHTTPSessionManager class]); 
    [self sendRequesUsingSessionManager:sessionManagerMock]; 
    OCMVerify([sessionManagerMock POST:@"test" parameters:[OCMArg checkWithBlock:^BOOL(NSDictionary *parameters) { 
     return YES; 
    }] success:[OCMArg any] failure:[OCMArg any]]); 
} 

@end 
+0

ARC est-il activé? – OliverM

+0

@OliverM: Oui, ARC est activé – iosdude

Répondre

2

Cela semble être un problème connu:

https://github.com/erikdoe/ocmock/issues/147

Je ne la solution suivante comme suggéré dans la discussion d'émission:

  1. changement OCMVerify-OCMExpect
  2. Déplacer votre code OCMExpect avant votre test fait un appel à la méthode attendue
  3. Appelez OCMVerifyAll à la fin