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.