Как мне высмеять метод, который принимает дескриптор в качестве аргумента в OCMock?
Я пытаюсь высмеять метод, имеющий эквивалент следующей подписи:
- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError **)error
Я хочу, чтобы он вернул небольшой словарь, чтобы мой тест мог убедиться, что код правильно использует словарь. однако, независимо от того, что я делаю, OCMock всегда возвращает ноль из метода, независимо от того, как я его отключил. Ошибка начинается с нуля в коде, который я тестирую, и это разные способы, с помощью которых я попытался:
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]];
и никто из них не работает. Поддерживает ли OCMock дескрипторы в качестве аргументов с заглубленным сообщением, и если да, то каков правильный способ сделать это?
Ответы
Ответ 1
К сожалению, я не нашел для этого хорошего решения. Самое лучшее, что я могу сказать, - попытаться максимально использовать NSError **, а затем положить его в изолированную функцию, которую вы можете полностью издеваться над своим частичным макетом.
Я обнаружил, что любой код, который использует ничего, кроме NSObject * (или полученных) или примитивных значений (NSInteger, BOOL и т.д.), практически невозможно протестировать с помощью OCMock.
Ответ 2
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:nil]];
или
NSError* someError = ...
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg setTo:someError]];
Вы также можете сделать
[[[mock stub] andReturn:someDict] uploadValues:YES error:[OCMArg anyPointer]];
но это может привести к тому, что ваш код неправильно подумает, что вы передали реальный NSError.
Ответ 3
С ARC ваше объявление метода будет выглядеть примерно так:
- (NSDictionary *) uploadValues:(BOOL)doSomething error:(NSError *__autoreleasing *)error;
Вот как я издеваюсь над этими типами методов:
BOOL mockDoSomething = YES;
NSError __autoreleasing *error = nil;
[[[mock stub] andReturn:someDict] uploadValues:OCMOCK_VALUE(mockDoSomething) error:&error];
Ответ 4
NSError *__autoreleasing *err = (NSError *__autoreleasing *) [OCMArg anyPointer];
[[[_mockReporter stub] andReturnValue:OCMOCK_VALUE((BOOL){YES})]
yourMethodCall:err];
Ответ 5
Я создал категорию на OCMArg, чтобы помочь в этой ситуации.
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
Затем, когда у меня есть параметр ошибки, мне нужно высмеять, используйте anyError
, например:
[[myMock stub] someMethodWithArg:anArg error:[OCMArg anyError]];