Como eu zombar um método que aceita uma alça como um argumento em OCMock?
-
18-09-2019 - |
Pergunta
Eu estou tentando zombar de um método que tem o equivalente da seguinte assinatura:
- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error
Eu quero que ele retorne um pequeno dicionário para que o meu teste pode ter certeza que o código usa o dicionário corretamente. Entretanto, não importa o que eu faço OCMock sempre retorna nil do método, independentemente de como eu stub-lo. O erro começa como nulo no código que estou testando, e estas são as diferentes maneiras que eu tentei arrancar-lo:
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 nenhum deles trabalho. alças de apoio Does OCMock como argumentos de mensagens stubbed e em caso afirmativo, qual é a maneira correta de fazer isso?
Solução
Infelizmente, eu não encontrei uma boa solução para isso também. O melhor que posso dizer é tentar fazer o uso do NSError ** tão pequeno quanto possível, e, em seguida, colocá-lo em uma função isolada que você pode completamente zombar fora em sua simulação parcial.
Eu estou achando que qualquer código que usa outra coisa senão um NSObject * (ou derivado) ou valores primitivos (NSInteger, BOOL, etc) é praticamente impossível de teste usando OCMock.
Outras dicas
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:nil]];
ou
NSError* someError = ...
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]];
Você também pode fazer
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]];
mas isso pode fazer com que seu código para incorretamente pensar que você passou para trás uma verdadeira NSError.
Com ARC, a sua declaração de método provavelmente será parecido com este:
- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError *__autoreleasing *)error;
Aqui está como eu zombar estes 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];
Eu criei uma categoria em OCMArg a ajuda com esta situação.
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
Então, sempre que tenho um param de erro que eu preciso para zombar, uso anyError
, assim:
[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];