2012-05-18 12 views
5

Estoy tratando de escribir algunos Unit Tests para probar algunos NSOperations personalizados que estamos escribiendo. Lo que me gustaría hacer es crear un simulacro de NSOperation y ponerlo en el NSOperationQueue, y luego esperar a que termine. Sé que puedo mezclar los métodos y no usar OCMoc k en absoluto, pero realmente no quiero hacer eso. Me gustaría usar OCMock. El código que estoy tratando de correr es algo como lo siguiente:OCMock an NSOperation

MYOperation *operation = [MYOperation new]; 
id mockOperation = [OCMockObject partialMockForObject:operation]; 
[NSOperationQueue *queue = [NSOperationQueue new]; 
[queue setMaxConcurrentOperationCount:1]; 
[queue addOperation:mockOperation]; 

Cuando la prueba de la unidad llega a esta línea:

[queue addOperation:mockOperation]; 

recibo una llamada a un objeto excepción desasignado. ¿Alguien tiene alguna sugerencia sobre cómo puedo superar esto?

+0

¿Es este un proyecto de ARC? –

+0

Sí, es un proyecto ARC. –

+0

Existe un problema conocido en el tiempo de ejecución de Apple que afecta a OCMock cuando ARC está habilitado. Más detalles aquí: http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=252 –

Respuesta

2

Si está utilizando ARC, operation probablemente se publique justo después de crear la simulación, ya que no se puede acceder de nuevo. Si lo cambia a esto, se debe corregir el error:

[queue addOperation:operation]; 

... lo que usted debe hacer de todos modos - usted está probando su objeto, no el simulacro.

+0

El problema con este enfoque es que si anulo un método en el simulacro, ¿eso se ejecuta o ¿Ejecuta el método en la Operación real? –

+0

Con simulaciones parciales, si resides/esperas un método, ese método se invocará en el simulacro en lugar del objeto real. Los simulacros parciales proporcionan una forma de interceptar mensajes particulares enviados a un objeto. De [OCMock docs] (http://ocmock.org/#features): 'Cuando se invoca un método stubbed utilizando una referencia a un Objeto, en lugar del simulacro, seguirá siendo manejado por el simulacro. –

0

Al utilizar ARC, la referencia al objeto en mockOperation se establecerá en nil de forma bastante agresiva (creo que demasiado agresivo) por el tiempo de ejecución de Apple. Sin embargo, no todo está perdido. Puede configurar sus stubs y expectativas utilizando mockOperation y aún pasar operación al método addOperation:; el simulacro parcial funciona incluso cuando utiliza una referencia al objeto original.