2012-08-31 5 views
5

Estoy escribiendo pruebas unitarias para encontrar si los elementos existen en una cierta punta. Por ejemplo, quiero recorrer las vistas de puntos y verificar si existe una salida de comentario 'commentTextView', para verificar si existe esa vista de texto.¿Es posible verificar si un elemento de IU tiene una determinada toma de referencia?

En este momento, solo veo métodos para verificar si existe un objetivo (como comprobar si un botón llamará a un cierto selector cuando se hace clic), pero no para verificar lo que necesito.

+0

Las "salidas de referencia" se enumeran por Xcode en el objeto al que hacen referencia. Si tiene la vista de texto con la intención de determinar si una determinada salida hace referencia a ella, entonces ya sabe que existe la vista de texto. –

+0

@PeterHosey digamos que tengo una vista con 3 botones. Quiero verificar si hay botones para Iniciar sesión, Registrarse y Ayuda. Comprobar la existencia de un UIButton no es útil. Yo diría que verificar que haya 3 botones también es inútil. Lo que me gustaría hacer es verificar si hay botones existentes que están vinculados a loginButton, registerButton y helpButton. Esto verificaría que hay 3 botones, y ellos hacen lo que se supone que deben hacer (confiando en que esas referencias hagan lo que se supone que deben hacer en el código). –

+1

¿Presumiblemente sus enchufes están conectados al "propietario de archivos", o algún objeto raíz en el plumín? ¿Puedes obtener ese objeto, recorrer las tomas que intentas probar y verificar su existencia, unicidad y otras propiedades? –

Respuesta

0

En lugar de verificar si tienen una toma de corriente, asígneles una etiqueta única. Seleccione los botones en Interface Builder y vaya al Inspector de Atributos a la derecha. Hacia la parte inferior debe haber una casilla para establecer la propiedad de la etiqueta del objeto. Luego, mientras recorre las vistas de su plumilla, puede verificar la etiqueta de cada una y usarla para determinar de qué vista se trata.

0

Estoy haciendo un par de suposiciones aquí, así que si soy una base, házmelo saber.

1) Tiene una lista de objetos que tendrán enchufes conectados, y una lista de esos puntos de venta. (Por ejemplo, el propietario del archivo es una clase MyViewController y tiene salidas view, label, button, y así sucesivamente, hay una UITableView con salidas delegate y dataSource, etc.)

2) Sus puntas están diseñadas para que sea práctico para encontrar todos los objetos en 1. por ejemplo, si algunos UIControl no está referenciado por un objeto de nivel superior o un objeto proxy, se ha dado un valor de etiqueta para que sea fácil de encontrar con viewWithTag:

Asumiendo estos son verdaderos, entonces usted podría probar que una punta se carga básicamente haciendo lo siguiente (en pseudo código)

for each referencingObject in nibObjects 
{ 
    for each outletName in referencingObject.outletNames 
    { 
     assertExistence(/* is an object referenced by this outlet? */) 
     assertProperties(/* does the object conform to the properties expected for this referencing object/outlet pairing? */) 
    } 
} 

Empecé a hacer una puñalada en una implementación de esto. Como los bits de iOS se basan en gran medida en la codificación de clave-valor, creo que hay mucho potencial por explorar en las pruebas de punta, por lo que vale. No me dediqué a manejar las acciones enviadas desde los objetos en la punta ya que tengo que salir de SO y estudiar, pero compartiré lo que hice hasta ahora.

Aquí está el código método de ensayo que escribí en mi SenTestCase subclase:

ViewController *vc = [[ViewController alloc] init]; 
UINib *nib1 = [UINib nibWithNibName:@"ViewController1" bundle:nil]; 
NSArray *topLevelObjects = [nib1 instantiateWithOwner:vc options:nil]; 

ReferencingObject *filesOwnerReferencingObject = [[ReferencingObject alloc] init]; 
filesOwnerReferencingObject.object = vc; 

//Make a referenced object outlet for the view 
ReferencedOutlet *viewOutlet = [[ReferencedOutlet alloc] init]; 
viewOutlet.name = @"view"; 
viewOutlet.propertyAssertionBlock = ^(id object) { 
    UIView *theView = (UIView *)object; 
    STAssertEquals(1.0f, theView.alpha, @"shouldn't have any transparency"); 
}; 

//Make a referenced object outlet for the label 
ReferencedOutlet *labelOutlet = [[ReferencedOutlet alloc] init]; 
labelOutlet.name = @"label"; 
labelOutlet.propertyAssertionBlock = ^(id object) { 
    UILabel *theLabel = (UILabel *)object; 
    NSString *expectedLabelText = @"ViewController1.xib"; 
    STAssertTrue([expectedLabelText isEqualToString:theLabel.text], nil); 

}; 

filesOwnerReferencingObject.outlets = @[ viewOutlet, labelOutlet ]; 


NSArray *referencingObjects = @[ filesOwnerReferencingObject ]; 
for (ReferencingObject *referencingObject in referencingObjects) 
{ 
    for (ReferencedOutlet *outlet in referencingObject.outlets) 
    { 
     id object = [filesOwnerReferencingObject.object valueForKey:outlet.name]; 
     STAssertNotNil(object, nil); 
     outlet.propertyAssertionBlock(object); 
    } 
} 

Y aquí es mi interfaz/implementación de las clases ReferencingObject y ReferencedOutlet.

@interface ReferencingObject : NSObject 

@property (nonatomic, strong) id object; 
@property (nonatomic, strong) NSArray *outlets; 

@end 

@implementation ReferencingObject 
@end 

typedef void (^ReferencedOutletPropertyAssertionBlock)(id); 

@interface ReferencedOutlet : NSObject 

@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) ReferencedOutletPropertyAssertionBlock propertyAssertionBlock; 

@end 

@implementation ReferencedOutlet 
@end 

Espero que esta respuesta sea de ayuda para usted u otra persona. Hazme saber si tienes alguna pregunta.

Cuestiones relacionadas