Bajo ARC
, tengo un objeto, Child
que tiene una propiedad weak
, parent
. Estoy intentando escribir algunas pruebas para Child
, y me estoy burlando de su propiedad parent
usando OCMock
.¿Cómo puedo obtener OCMock en ARC para dejar de registrar un conjunto de subclase NSProxy utilizando una propiedad débil?
Bajo ARC, el establecimiento de una subclase NSProxy
usando un regulador débil propiedad sintetizada no establecer la propiedad ... la línea después de la propiedad débil se establece, la comprobación revela que ya es nil
. Aquí está el ejemplo concreto:
@interface Child : NSObject
@property (nonatomic, weak) id <ParentInterface>parent;
@end
@implementation Child
@synthesize parent = parent_;
@end
// ... later, inside a test class ...
- (void)testParentExists
{
// `mockForProtocol` returns an `NSProxy` subclass
//
OCMockObject *aParent = [OCMockObject mockForProtocol:@protocol(ParentInterface)];
assertThat(aParent, notNilValue());
// `Child` is the class under test
//
Child *child = [[Child alloc] init];
assertThat(child, notNilValue());
assertThat(child.parent, nilValue());
child.parent = (id<ParentInterface>)aParent;
assertThat([child parent], notNilValue()); // <-- This assertion fails
[aParent self]; // <-- Added this reference just to ensure `aParent` was valid until the end of the test.
}
Sé que puedo evitar esto usando una propiedad assign
en lugar de un weak
propiedad para el Child
hacer referencia a la Parent
, pero entonces tendría que nil
la parent
cuando estaba hecho con eso (como una especie de hombre de las cavernas), que es exactamente el tipo de cosa que se suponía que ARC obviaba.
¿Alguna sugerencia sobre cómo hacer que esta prueba pase sin cambiar el código de mi aplicación?
Editar: Parece que tiene que ver con OCMockObject
ser un NSProxy
, si hago aParent
ser una instancia de NSObject
, la child.parent
débil de referencia "tiene" un valor no nulo. Todavía estoy buscando una forma de hacer que esta prueba pase sin cambiar el código de la aplicación.
Editar 2: Después de aceptar la respuesta de Blake, hice una implementación en mi proyecto de una macro de preprocesador que condicionalmente cambió mis propiedades de débil -> asignar. Su millaje puede variar:
#if __has_feature(objc_arc)
#define BBE_WEAK_PROPERTY(type, name) @property (weak, nonatomic) type name
#else
#define BBE_WEAK_PROPERTY(type, name) @property (assign, nonatomic) type name
#endif
Consulte este mensaje de confirmación: https://github.com/erikdoe/ocmock/commit/dbdb233ae84498077f7e946abb49731968333f0b Parece que el equipo de OCMock está investigando lo mismo. – Don