2010-05-05 14 views
15

Je suis confronté à un problème et je voulais confirmer que je fais les choses correctement.Xcode Unit Testing - Accès aux ressources de l'ensemble de l'application?

Je peux tester des choses simples avec mes tests SenTestingKit, et qui fonctionne bien. J'ai mis en place un ensemble de tests unitaires et l'ai défini comme une dépendance à la cible de l'application principale. Il exécute tous les tests avec succès chaque fois que j'appuie sur cmd + B.

Voici où je suis confronté à des problèmes. J'ai quelques fichiers XML que j'ai besoin de charger à partir du dossier des ressources dans le cadre de l'application. Étant un bon testeur d'unité, je veux écrire des tests unitaires pour s'assurer qu'ils se chargent correctement.

J'ai un code qui ressemble à ceci:

NSString *filePath = [[NSBundle mainBundle] 
    pathForResource:@"foo" ofType:@"xml"]; 

Cela fonctionne lors de l'exécution de l'application, mais lors d'un test unitaire, mainBundle points au mauvais paquet, de sorte que cette ligne de renvoie le code zéro.

Alors je l'ai changé à utiliser une classe connue comme ceci:

NSString *filePath = [[NSBundle bundleForClass:[Config class]] 
    pathForResource:@"foo" ofType:@"xml"]; 

Cela ne fonctionne pas non plus, car pour le test de même compiler le code comme celui-ci, il Config doit faire partie de la cible d'essai unitaire. Si j'ajoute cela, le bundle de cette classe devient le bundle de test unitaire. (Pouah!)

Est-ce que je m'approche de ceci dans le mauvais sens?

+0

J'ai vu une vidéo iTunes U sur ce sujet et ils ont dit que si la cible de test n'était pas configurée correctement, elle testerait sur la dernière version en cours d'exécution au lieu de construire puis d'exécuter des tests. Avez-vous vérifié pour vous assurer que ce n'est pas le cas? – Tacoman667

+0

Essayez de créer le projet de test unitaire? Une partie de l'ensemble de tests unitaires consiste à exécuter les scripts, donc je l'ai configuré comme une dépendance de la cible de mon application. CMD + B devrait toujours exécuter des tests. –

Répondre

20

Tout en essayant de reproduire votre problème, il m'a frappé: Avez-vous essayé d'ajouter simplement vos ressources à votre paquet de test? Cela causerait-il des problèmes pour vous? Je l'ai fait exactement, et cela a très bien fonctionné pour moi. Par exemple:

code:

- (void)testBundleLoading { 
    NSLog(@"Main Bundle Path: %@", [[NSBundle mainBundle] bundlePath]); 

    for (NSBundle *bundle in [NSBundle allBundles]) { 
    NSLog(@"%@: %@", [bundle bundleIdentifier], 
        [bundle pathForResource:@"fire" ofType:@"png"]); 
    } 
} 

Sortie:

2010-05-05 14:31:05.961 otest[16970:903] Main Bundle Path: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin 
2010-05-05 14:31:05.962 otest[16970:903] (null): (null) 
2010-05-05 14:31:05.963 otest[16970:903] com.freetimestudios.KayakKingTests: /Volumes/FreeTime/KayakKing/build/Debug-iphonesimulator/KayakKingTests.octest/fire.png 

J'espère que cela aide.

+0

Exactement ce dont j'avais besoin, merci! –

+0

c'est une petite boucle pratique. Merci! –

0

je suis tombé sur ce problème avec Xcode 4 et mon problème était que j'avais un vieux projet Xcode 3 et en quelque sorte l'info plist pour la cible de test avait disparu. J'ai ajouté un nouveau UnitTests-Info.plist au projet et j'ai été soudainement capable de récupérer des ressources à nouveau. Essayez la construction et ensuite exécutez les tests.