Подтвердить что ты не робот

Как мне высмеять метод, который принимает дескриптор в качестве аргумента в 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 дескрипторы в качестве аргументов с заглубленным сообщением, и если да, то каков правильный способ сделать это?

4b9b3361

Ответ 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]];