2011-04-13 3 views
9

à partir du modèle CoreData, j'ai construit une application iphone qui utilise CoreData pour manipuler un modèle de données. Fonctionne jusqu'à présent ...Comment faire UnitTests avec CoreData?

Maintenant j'ai décidé, j'ai besoin de tests "unitaires" pour vérifier si le modèle de données de base est manipulé correctement (jusqu'ici je n'ai fait que des vérifications manuelles et vérifié la base de données directement avec CoreDataEditor). J'ai suivi

http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html

sur la façon de mettre en place UnitTests dans Xcode. Cela fonctionne jusqu'à maintenant pour les tests de logique et d'application. Cependant, je ne peux pas obtenir les tests "unit" fonctionnant avec un backend CoreData (il ne trouve pas mon modèle de données et je ne sais pas quoi inclure ou lier etc ...)

Y at-il un pointeur/une description sur la façon de faire "unité" de test d'une application iphone de données de base? PS: Je sais que les tests avec la base de données backend ne sont pas à proprement parler des tests "unitaires". Peu m'importe si le test est sur le simulateur avec l'application réelle (ApplicationTesting) ou s'il s'agit juste d'un backend de données de base spécifiquement pour les tests unitaires (LogicTest) que je remplirais avec certains objets de test pendant setUp.

EDIT: J'ai trouvé How to unit test my models now that I am using Core Data? et http://chanson.livejournal.com/115621.html mais maintenant je suis tombé sur le problème décrit dans iPhone UnitTesting UITextField value and otest error 133 ... eh bien, sauf que j'ai le code d'erreur 134: - (((Toutes les idées

Répondre

11

. OK, je l'ai eu à travailler ...

  1. Créer LogicTests comme décrit ici (section mise en place d'essais logique): http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html

  2. Ajoutez manuellement le CoreData.framework à la cible nouvellement créée pour les tests logiques: Faites-la glisser de la cible de l'application vers la cible de test logique (dossier "link binary with libraries). Cliquez avec le bouton droit sur votre fichier * .xcdatamodeld et sélectionnez Obtenir des informations -> Cibles. Sélectionnez la cible Logic Tests (pour une raison étrange, la cible d'application réelle n'a pas été sélectionnée dans mon cas ... mais cela fonctionne)

  3. Dans votre classe de test unitaire (créée à l'étape 1: LogicTests.m), ajoutez le méthode suivante:

    - (void) setUp { 
    
        NSArray *bundles = [NSArray arrayWithObject:[NSBundle bundleForClass:[self class]]]; 
        NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:bundles]; 
        STAssertNotNil(mom, @"ManangedObjectModel ist nil"); 
    
        NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom]; 
        STAssertTrue([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL] ? YES : NO, @"Should be able to add in-memory store");  
    
        self.context = [[NSManagedObjectContext alloc] init]; 
        self.context.persistentStoreCoordinator = psc; 
    
        [mom release]; 
        [psc release]; 
    } 
    

maintenant, vous avez un test logique avec Core Data soutien mis en place. Le test logique est effectué de manière isolée (sans simulateur) en créant la cible LogicTests. Pour cela, une base de données temporaire en mémoire est créée. Dans vos méthodes de test, vous pouvez maintenant faire quelque chose comme:

- (void) testStuff {  
    NSManagedObject *managedObj = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:self.context]; 

    [managedObj setValue:[NSNumber numberWithInt:90000] forKey:@"id"]; 

    NSError *error = nil; 
    if (![self.context save:&error]) { 
     STFail(@"Fehler beim Speichern: %@, %@", error, [error userInfo]); 
    } 
} 

Espérons que cela aide .... Amusez-vous!

+1

Dommage que le lien ne mène nulle part plus longtemps. – Houman

+0

J'ai trouvé ce lien vers un exemple de code qui semble être le compagnon de ce lien qui ne fonctionne plus: https://developer.apple.com/library/ios/samplecode/UnitTests/Introduction/Intro.html – idStar