Pregunta

En mi trabajo del día he estado arruinado por never() de Mockito verificación , que puede confirmar que un método simulacro nunca es llamado.

¿Hay alguna manera de lograr lo mismo usando Objective-C y OCMock? He estado usando el código de abajo, que funciona pero se siente como un truco. Estoy esperando que hay una manera mejor ...

- (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!");
}
¿Fue útil?

Solución

Desde r69 de OCMock, es posible rechazar una llamada al método http: //svn.mulle -kybernetik.com/OCMock/trunk/Source/Changes.txt

  

Niza burla / fallar rápido Cuando una   método se llama en un objeto mock que   No se ha establecido con cualquiera esperaría   o talón del objeto de burla lanzará una   excepción. Este modo a prueba de rápida puede ser   desactivado mediante la creación de un "buen" simulacro:

id mock = [OCMockObject niceMockForClass:[SomeClass class]]
     

Mientras agradables burla simplemente ignorarán   todos los métodos inesperados es posible   a métodos específicos Disallow:

[[mock reject] someMethod]
     

Tenga en cuenta que en el modo a prueba de rápido, si el   excepción se ignora, será   relanza al verificar que se llama. Esta   hace que sea posible para asegurar que   invocaciones no deseados de   notificaciones, etc. pueden ser detectados.

Citado de: http://www.mulle-kybernetik.com/software/OCMock/#features

Otros consejos

Por lo que yo sé OCMock fallará automáticamente cuando se llama a verificar y métodos que no han sido registrados fueron llamados. Una maqueta que no se quejan si los métodos inesperados fueron llamados se llama un "buen simulacro".

- (void)testSomeMethodIsNeverCalled {
    id mock = [OCMockObject mockForClass:[MyObject class]];

    [mock forbiddenMethod];
    [mock verify]; //should fail
}

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];

También puede verse en la necesidad de asegurar un método que nunca se pidió a un objeto que se está burlando de forma parcial.

He creado una macro para esto:

#define andDoFail andDo:^(NSInvocation *invocation) { STFail(@"Should not have called this method!"); }

Yo lo uso como esto:

[[[_myPartialMock stub] andDoFail] unexpectedMethod];

También podría intentar algo como esto, al estilo de 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 fugas asociadas a este código. Tengo la idea de la lectura de esta página: http://thirdcog.eu/pwcblocks/

Para asegurarse de que su método no llama, creo que tenemos que hacer una aserción antes de la testMethod llamada. Así que asegúrese de poner OCMReject antes de ejecutar el método de ensayo para escuchar qué método se activará cuando se ejecuta testMethod:

OCMReject([mock someMethod]);
[mock testMethod];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top