2010-12-05 49 views
27

我正在使用OCMock 1.70,並且出現了一個模擬返回BOOL值的簡單方法的問題。這是我的代碼:存根使用OCMock返回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. 
} 

我在做什麼錯?

回答

60

您需要使用andReturnValue:andReturn:

[[[mock stub] andReturnValue:OCMOCK_VALUE(boolResult)] methodWithBOOLResult]; 
5

提示: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

較新版本的OCMock應該讓OCMOCK_VALUE也可以用於常量; ```OCMOCK_VALUE(NO)``,```@ NO``和`@(NO)```都應該工作。 – 2014-05-24 17:58:43

1

我使用OCMock版本3.3.1並且此語法適用於我:

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

有關更多示例,請參閱OCMock documentation