Domanda

Sto cercando di prendere in giro un metodo che ha l'equivalente del seguente firma:

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

lo voglio restituire un piccolo dizionario in modo che il mio test può assicurarsi che il codice utilizza il dizionario correttamente. Tuttavia, non importa quello che faccio OCMock restituisce sempre pari a zero dal metodo, a prescindere da come i stub fuori. L'errore inizia come pari a zero nel codice sto testando, e questi sono i diversi modi che ho provato spegnendo esso:

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]];

e nessuno di loro lavoro. Fa maniglie di sostegno OCMock come argomenti di messaggi sradicate e, se sì, qual è il modo corretto per farlo?

È stato utile?

Soluzione

Purtroppo, non ho trovato una buona soluzione per questa operazione. La cosa migliore che posso dire è per cercare di rendere l'uso del NSError ** il più piccolo possibile, e poi metterlo in una funzione isolata che si può completamente deridere sul vostro finto parziale.

Ho constatato che qualsiasi codice che utilizza qualcosa di diverso da un NSObject * (o derivati) o di valori primitivi (NSInteger, BOOL, ecc) è praticamente impossibile testare utilizzando OCMock.

Altri suggerimenti

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

o

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

Si potrebbe anche fare

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

, ma questo potrebbe causare il codice a pensare erroneamente che è passato di nuovo un vero e proprio NSError.

Con ARC, la vostra dichiarazione di metodo sarà probabilmente simile a questa:

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

Ecco come mi prendo gioco questi tipi di metodi:

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];

Ho creato una categoria a OCMArg per aiutare con questa situazione.

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

Poi, ogni volta che ho un errore di param ho bisogno di prendere in giro, uso anyError, in questo modo:

[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top