objective c - ¿Cómo puedo usar OCMock para verificar que nunca se llame a un método?
objective-c cocoa (6)
A partir de la versión 3.3 OCMock tiene OCMReject macro.
id mock = OCMClassMock([MyObject class]);
OCMReject([mock forbiddenMethod]);
// exception will raise
[mock forbiddenMethod];
En mi trabajo diario, me han echado a perder la verificación never()
Mockito , que puede confirmar que nunca se llama a un método falso.
¿Hay alguna manera de lograr lo mismo con Objective-C y OCMock? He estado usando el siguiente código, que funciona pero se siente como un truco. Espero que haya una mejor manera ...
- (void)testSomeMethodIsNeverCalled {
id mock = [OCMockObject mockForClass:[MyObject class]];
[[[mock stub] andCall:@selector(fail) onObject:self] forbiddenMethod];
// more test things here, which hopefully
// never call [mock forbiddenMethod]...
}
- (void)fail {
STFail(@"This method is forbidden!");
}
Desde r69 de OCMock, es posible rechazar un método llamado http://svn.mulle-kybernetik.com/OCMock/trunk/Source/Changes.txt
Simples burlas / fallas rápidas Cuando se invoca un método en un objeto simulado que no se ha configurado con expect o stub, el objeto simulado generará una excepción. Este modo a prueba de fallas se puede desactivar creando un simulacro "agradable":
id mock = [OCMockObject niceMockForClass:[SomeClass class]]
Mientras que los simulacros bonitos simplemente ignorarán todos los métodos inesperados, es posible desautorizar métodos específicos:
[[mock reject] someMethod]
Tenga en cuenta que en el modo de falla rápida, si se ignora la excepción, se volverá a lanzar cuando se llame a la verificación. Esto permite asegurar que se puedan detectar invocaciones no deseadas de notificaciones, etc.
Citado de: http://www.mulle-kybernetik.com/software/OCMock/#features
Para asegurarse de que su método no se llame, creo que debemos hacer una testMethod
antes de que testMethod
el testMethod
. Así que asegúrese de poner OCMReject
antes de ejecutar el método de prueba para escuchar qué método se activará cuando ejecute testMethod
:
OCMReject([mock someMethod]);
[mock testMethod];
Por lo que sé, OCMock fallará automáticamente cuando llame a verificar y se invocaron los métodos que no se han registrado. Un simulacro que no se quejaría si se llamaran métodos inesperados se llama un "buen simulacro".
- (void)testSomeMethodIsNeverCalled {
id mock = [OCMockObject mockForClass:[MyObject class]];
[mock forbiddenMethod];
[mock verify]; //should fail
}
También puede ser necesario asegurarse de que nunca se invoca un método en un objeto del que se burla parcialmente.
Creé una macro para esto:
#define andDoFail andDo:^(NSInvocation *invocation) { STFail(@"Should not have called this method!"); }
Lo uso así:
[[[_myPartialMock stub] andDoFail] unexpectedMethod];
También puedes probar algo como esto, a la JavaScript:
- (void)aMethod {
__block BOOL b = NO;
id mock = [OCMockObject mockForClass:[UIView class]];
[[[mock stub] andDo:^(NSInvocation *i) { b = YES; }] resignFirstResponder];
[mock resignFirstResponder];
NSLog(@"And b is: %i", b); // This reads "And b is: 1" on the console
}
No estoy seguro de si hay alguna fuga asociada con este código. Me vino la idea de leer esta página: http://thirdcog.eu/pwcblocks/