cocoa unit-testing ocmock

cocoa - Completar un método que devuelve un BOOL con OCMock



unit-testing (3)

Estoy usando OCMock 1.70 y estoy teniendo un problema burlando un método simple que devuelve un valor BOOL. Aquí está mi código:

@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. }

¿Qué estoy haciendo mal?


Debes usar andReturnValue: not andReturn:

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


Sugerencia: andReturnValue: acepta cualquier NSValue , especialmente NSNumber . Para agilizar más rápidamente los métodos con valores de retorno primitivos / escalares, omita por completo la declaración de variables locales y use [NSNumber numberWithXxx:...] .

Por ejemplo:

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

Para puntos de bonificación auto-boxing, puede usar la sintaxis numérica-numérica ( Clang docs ):

[[[mock stub] andReturnValue:@(NO)] methodWithBOOLResult]; [[[mock stub] andReturnValue:@(123)] methodWithIntResult]; [[[mock stub] andReturnValue:@(123.456)] methodWithDoubleResult]; etc.


Estoy usando la versión 3.3.1 de OCMock y esta sintaxis funciona para mí:

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

Consulte la documentación de OCMock para obtener más ejemplos.