2012-08-31 12 views
5

Sto scrivendo unit test per trovare se gli elementi esistono su un determinato pennino. Ad esempio, voglio passare in rassegna le viste di un pennino e controllare se ne esiste una con un punto di riferimento "commentTextView", per verificare se esiste questa visualizzazione di testo.È possibile verificare se un elemento dell'interfaccia utente ha una determinata presa di riferimento?

In questo momento, vedo solo i metodi per verificare se esiste un obiettivo (come verificare se un pulsante chiamerà un determinato selettore quando viene cliccato), ma non per controllare ciò di cui ho bisogno.

+0

"Riferimenti alle prese" sono elencati da Xcode sull'oggetto a cui fanno riferimento. Se hai la vista del testo con l'intento di determinare se è referenziata da un certo punto vendita, allora sai già che la visualizzazione del testo esiste. –

+0

@PeterHosey diciamo che ho una vista con 3 pulsanti. Voglio controllare se ci sono i pulsanti per Login, Register e Help. Il controllo dell'esistenza di un UIButton non è utile. Direi che controllare che ci siano 3 pulsanti è anche inutile. Quello che mi piacerebbe fare è controllare se ci sono pulsanti esistenti collegati a loginButton, registerButton e helpButton. Ciò verificherebbe che ci sono 3 pulsanti e fanno ciò che dovrebbero fare (credendo che quei riferimenti facciano quello che dovrebbero nel codice). –

+1

Presumibilmente le tue prese sono collegate al "proprietario dei file" o qualche oggetto radice nel pennino? Puoi ottenere quell'oggetto, scorrere le prese che stai provando a testare e verificare la loro esistenza, unicità e altre proprietà? –

risposta

0

Invece di controllare se hanno una presa, assegnare a tutti un tag univoco. Seleziona i pulsanti in Interface Builder e vai a Impostazioni Attributi a destra. Verso il fondo dovrebbe essere una casella per impostare la proprietà del tag dell'oggetto. Quindi, mentre scorri le viste del pennino, puoi controllare il tag di ognuno e usarlo per determinare quale vista è.

0

Qui sto facendo un paio di ipotesi, quindi se sono di base, fammi sapere.

1) Si dispone di un elenco di oggetti con prese collegate e un elenco di tali prese. (Ad esempio, il proprietario del file è una classe MyViewController e ha punti vendita view, label, button, e così via, c'è un UITableView con prese delegate, e dataSource, ecc)

2) I suoi pennini sono progettati per rendere più pratico Ad esempio, se ad alcuni UIControl non viene fatto riferimento da un oggetto di livello superiore o da un oggetto proxy, è stato assegnato un valore di tag per facilitarne la ricerca con viewWithTag:

Presupposto queste sono vere, quindi si può verificare che un pennino venga caricato facendo essenzialmente quanto segue (in pseudo codice)

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? */) 
    } 
} 

Ho iniziato a fare una coltellata a un'implementazione di questo. Dal momento che i pennini iOS si basano molto sulla codifica dei valori-chiave, penso che ci sia un grande potenziale da esplorare nel testare i pennini, per quello che vale. Non sono riuscito a gestire le azioni inviate dagli oggetti nel pennino, perché devo scendere da SO e studiare, ma condividerò ciò che ho fatto finora.

Ecco il codice di metodo di prova che ho scritto nel mio SenTestCase sottoclasse:

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); 
    } 
} 

e qui è la mia interfaccia/implementazione delle classi ReferencingObject e 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 

Speriamo che questa risposta ti sia di aiuto o qualcun altro. Fatemi sapere se avete domande.

Problemi correlati