Question

Je suis en train de se moquer d'une méthode qui a l'équivalent de la signature suivante:

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error

Je veux revenir un petit dictionnaire pour que mon test peut assurer que le code utilise le dictionnaire correctement. Cependant, peu importe ce que je fais OCMock renvoie toujours nulle de la méthode, quelle que soit la façon dont i Stub it out. L'erreur commence comme nul dans le code que je teste, et ce sont les différentes façons que j'ai essayé stubbing il:

NSError * error = nil;
[[[mock stub] andReturn:someDict] uploadValues:YES error:&error];

[[[mock stub] andReturn:someDict] uploadValues:YES error:nil];

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg any]];

et aucun d'entre eux travaillent. Est-ce que OCMock poignées de support comme arguments de message écrasa et si oui, quelle est la bonne façon de le faire?

Était-ce utile?

La solution

Malheureusement, je ne l'ai pas trouvé une bonne solution pour cela non plus. Le mieux que je peux dire est d'essayer de rendre l'utilisation de l'NSError ** aussi petite que possible, puis le mettre dans une fonction isolée que vous pouvez complètement se moquer sur votre maquette partielle.

Je trouve que tout code qui utilise autre chose qu'un NSObject * (ou dérivés) ou valeurs primitives (NSInteger, BOOL, etc.) est à peu près impossible de tester en utilisant OCMock.

Autres conseils

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:nil]];

ou

NSError* someError = ...
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]];

Vous pouvez également faire

[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]];

mais cela pourrait causer votre code à penser à tort que vous avez passé un vrai retour NSError.

Avec ARC, votre déclaration de méthode se penchera probablement comme ceci:

- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError *__autoreleasing *)error;

Voici comment je me moque de ces types de méthodes:

BOOL mockDoSomething = YES;

NSError __autoreleasing *error = nil;

[[[mock stub] andReturn:someDict] uploadValues:OCMOCK_VALUE(mockDoSomething) error:&error];
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer];

[[[_mockReporter stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})]
   yourMethodCall:err];

J'ai créé une catégorie sur OCMArg pour aider à cette situation.

OCMArg + Helpers.h:

@interface OCMArg (Helpers)

+ (NSError *__autoreleasing *)anyError;

@end

OCMArg + Helpers.m:

@implementation OCMArg (Helpers)

+ (NSError *__autoreleasing *)anyError {
    return (NSError *__autoreleasing *)[OCMArg anyPointer];
}

@end

Alors, chaque fois que j'ai une erreur param je dois railler, utiliser anyError, comme suit:

[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top