2011-03-25 22 views

Respuesta

18

Mirando el test file para OCMock, parece que es necesario tener el mismo número de expect s que tiene llamadas. Así que si usted llama someMethod tres veces, lo que necesita hacer ...

[[mock expect] someMethod]; 
[[mock expect] someMethod]; 
[[mock expect] someMethod]; 

...test code... 

[mock verify]; 

Esto parece fea, sin embargo, tal vez usted puede poner en un bucle?

+5

Creo que esto sólo se verifica que el método ha sido llamado al menos 3 veces, por lo que se también pase si fue llamado 4 veces. –

+1

Mi prueba con v2.2.3 muestra que debe haber una coincidencia exacta entre el número de espera y el número de llamadas a algún Método – Skotch

+2

@dB y Skotch: esto depende del tipo de Mock que utilice, si crea un niceMock espera 'al menos' el número - para un simulacro habitual, espera el número exacto –

13

He tenido éxito mediante el aprovechamiento de la capacidad de delegar a un bloque:

OCMStub([mock someMethod]).andDo(^(NSInvocation *invocation) 
{ /* block that handles the method invocation */ }); 

Dentro del bloque, que sólo se incrementa una variable callCount, y luego afirman que coincida con el número esperado de llamadas. Por ejemplo:

 
- (void)testDoingSomething_shouldCallSomeMethodTwice { 
    id mock = OCMClassMock([MyClass class]); 

    __block int callCount = 0; 
    OCMStub([mock someMethod]).andDo(^(NSInvocation *invocation) { 
     ++callCount; 
    }); 

    // ...exercise code... 

    int expectedNumberOfCalls = 2; 
    XCTAssertEqual(callCount, expectedNumberOfCalls); 
} 

El bloque debe ser invocado cada vez someMethod se llama, por lo callCount siempre debe ser el mismo que el número de veces que el método se llama en realidad.

+0

Debe hacer esto en todos los métodos apilados de clases y no puede llamar a 'OCMVerifyAll (mock)', ¿verdad? ¿Sabes que sigue siendo el mejor enfoque para las versiones actuales de OCMock? (OCMockito parece tener un mejor soporte en esta área.) – Drux

+0

Estoy de acuerdo en que deseo que OCMock tenga un mejor soporte '' 'OCMVerify (stub, callCount)' '', pero esto funciona bien. Gran respuesta. –

+0

Idea similar: utilice el [OCMArg checkWithBlock:] y actualice el callCount desde ese bloque. Pero de alguna manera esto no funciona como se esperaba. CheckWithBlock se llama 2 veces por cada llamada de método. – JanR

1

Si es necesario comprobar si un método sólo se llama vez, puede hacerlo de esta manera

[self.subject doSomething]; 
OCMVerify([self.mock method]); 

OCMReject([self.mock method]); 
[self.subject doSomething]; 
Cuestiones relacionadas