Tengo una configuración bastante simple para esta prueba unitaria. Tengo una clase que tiene una propiedad delegado:¿Por qué la propiedad delegada débil de mi objeto es nula en las pruebas de mi unidad?
@interface MyClass : NSObject
...
@property (nonatomic, weak) id<MyDelegateProtocol> connectionDelegate;
...
@end
y me puse el delegado en mi prueba:
- (void)testMyMethod_WithDelegate {
id delegate = mockDelegateHelper(); // uses OCMock to create a mock object
[[delegate expect] someMethod];
myClassIvar.connectionDelegate = delegate;
[myClass someOtherMethod];
STAssertNoThrow([delegate verify], @"should have called someMethod on delegate.");
}
Sin embargo, el delegado no el valor definido en la línea 3 de mi prueba de la unidad, por lo que # someMethod nunca se llama. Cuando cambio a
myClassIvar.connectionDelegate = delegate;
STAssertNotNil(myClassIvar.connectionDelegate, @"delegate should not be nil");
que no existe. Estoy usando ARC, así que mi corazonada fue que la propiedad débil estaba siendo desasignada. Efectivamente, cambiarlo a strong
hace que pase el STAssertNotNil
. Pero no quiero hacer eso con un delegado, y no entiendo por qué eso hace la diferencia aquí. Por lo que he leído, todas las referencias locales en ARC son strong
, y STAssertNotNil(delegate)
pasa. ¿Por qué mi propiedad delegación débil es nula cuando el mismo objeto en una variable local no?
+1 Genial, parece que tuve [la idea correcta] (http://stackoverflow.com/a/9058542/31158) ... ¡Gracias por encontrar la información correcta! –
Es posible que desee probar el simulador iOS 6.0. Si el problema débil/Proxy es un error de tiempo de ejecución (y lo es), esto podría resolverse en iOS 6.0. Lo probé, pero no puedo comentar sobre él (ya que todavía está bajo NDA). Pero realmente deberías intentarlo. De Verdad. – Jelle