objective-c cocoa mocking mockito ocmock

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/