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.
"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. –
@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). –
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à? –