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?

Foi útil?

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]];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top