Pregunta

Estoy tratando de burlarse de un método que tiene el equivalente a la firma siguiente:

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

Quiero que vuelva un pequeño diccionario para que mi prueba puede asegurarse de que el código utiliza el diccionario correctamente. Sin embargo, no importa lo que hago OCMock siempre devuelve nil del método, independientemente de cómo me golpeo a cabo. El error comienza como nula en el código que estoy probando, y éstas son las diferentes maneras lo he intentado stubbing que:

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

y ninguno de ellos funciona. Hace manillas de sujeción OCMock como argumentos de mensajes cortos y se si es así, ¿cuál es la forma correcta de hacerlo?

¿Fue útil?

Solución

Lamentablemente, no he encontrado una buena solución para esto tampoco. Lo mejor que puedo decir es tratar de hacer que el uso de la NSError ** lo más pequeño posible, y luego ponerlo en una función aislada que puede burlarse completamente fuera de su maqueta parcial.

Me estoy encontrando que cualquier código que utiliza no sea un NSObject * (o derivados) o nada (NSInteger valores primitivos, BOOL, etc) que es casi imposible de probar usando OCMock.

Otros consejos

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

o

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

También puede hacer

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

pero esto podría hacer que el código para pensar incorrectamente que ha devuelto un NSError real.

Con ARC, su declaración de método será probablemente el siguiente aspecto:

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

Aquí es cómo se burlan de estos tipos de métodos:

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

He creado una categoría en OCMArg para ayudar con esta situación.

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

A continuación, cada vez que tengo un parámetro de error que necesita para burlarse, el uso anyError, así:

[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top