Заглушка метод, который возвращает BOOL с OCMock - PullRequest
29 голосов
/ 05 декабря 2010

Я использую OCMock 1.70 и у меня проблема с насмешкой над простым методом, который возвращает значение BOOL.Вот мой код:

@interface MyClass : NSObject
- (void)methodWithArg:(id)arg;
- (BOOL)methodWithBOOLResult;
@end
@implementation MyClass
- (void)methodWithArg:(id)arg {
    NSLog(@"methodWithArg: %@", arg);
}
- (BOOL)methodWithBOOLResult {
    NSLog(@"methodWithBOOLResult");
    return YES;
}
@end

- (void)testMock {
    id real = [[[MyClass alloc] init] autorelease];
    [real methodWithArg:@"foo"];
    //=> SUCCESS: logs "methodWithArg: foo"

    id mock = [OCMockObject mockForClass:[MyClass class]];
    [[mock stub] methodWithArg:[OCMArg any]];
    [mock methodWithArg:@"foo"];
    //=> SUCCESS: "nothing" happens

    NSAssert([real methodWithBOOLResult], nil);
    //=> SUCCESS: logs "methodWithBOOLResult", YES returned

    BOOL boolResult = YES;
    [[[mock stub] andReturn:OCMOCK_VALUE(boolResult)] methodWithBOOLResult];
    NSAssert([mock methodWithBOOLResult], nil);
    //=> FAILURE: raises an NSInvalidArgumentException:
    //   Expected invocation with object return type.
}

Что я делаю не так?

Ответы [ 3 ]

63 голосов
/ 05 декабря 2010

Вам нужно использовать andReturnValue:, а не andReturn:

[[[mock stub] andReturnValue:OCMOCK_VALUE(boolResult)] methodWithBOOLResult];
5 голосов
/ 12 декабря 2013

Подсказка: andReturnValue: принимает любой NSValue - особенно NSNumber. Чтобы быстрее заглушить методы с примитивными / скалярными возвращаемыми значениями, полностью пропустите объявление локальной переменной и используйте [NSNumber numberWithXxx:...].

Например:

[[[mock stub] andReturnValue:[NSNumber numberWithBool:NO]] methodWithBOOLResult];

Для получения автоматических бонусов вы можете использовать числовой синтаксис ( Clang docs ):

[[[mock stub] andReturnValue:@(NO)] methodWithBOOLResult];
[[[mock stub] andReturnValue:@(123)] methodWithIntResult];
[[[mock stub] andReturnValue:@(123.456)] methodWithDoubleResult];
etc.
1 голос
/ 15 декабря 2016

Я использую версию 3.3.1 OCMock, и этот синтаксис работает для меня:

SomeClass *myMockedObject = OCMClassMock([SomeClass class]);
OCMStub([myMockedObject someMethodWithSomeParam:someParam]).andReturn(YES);

См. Документацию OCMock для получения дополнительной информации.

...