Tests Unitaires AppDelegate et CoreData

MagiicMagiic Membre

Salut,


 


Je cherche à  faire des tests unitaires sur un projet. Je rencontre un problème lorsque je souhaite accéder à  des classes et méthodes qui utilisent mon modèle de donnée avec CoreData. 


 


J'utilise le principe des catégories ou ici des extensions pour mes entités NSManagedObject. Pour la récupération des contenus, j'utilise des méthodes de classe. Afin de récupérer le contexte NSManagedObjectContext j'utilise la ligne suivante



(UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!

Je reçois des erreurs qui m'indiquent que AppDelegate n'est pas déclarée puisque je n'ai pas ajouté ce dernier dans mon Target Membership lorsque je lance des tests unitaires pour un ViewController qui utilise mon modèle de donnée. Si je le fais, une nouvelle erreur, toujours à  la même ligne m'indiquant ceci : Could not cast value of type 'DontUse.AppDelegate' (0x101cb8290) to 'DontUseTests.AppDelegate'


 


Je comprends ce qu'il dit mais je ne sais pas comment résoudre ça.


Réponses

  • AliGatorAliGator Membre, Modérateur
    1) En arrêtant d'utiliser l'AppDelegate pour garder une référence à  ton ManagedObjectContext. Je n'ai jamais compris pourquoi les templates Apple pour un projet CoreData mettait la création du MOC a cet endroit, obligeant à  accéder à  l'AppDelegate d'un peu partout dans ton code pour accéder au MOC, ce qui est une très mauvaise pratique


    2) En recréant un MOC dédié pour les tests, différent de celui que tu utilises pour l'application, ce qui de toutes façons est nécessaire si tu ne veux pas que tes tests unitaires viennent pourrir ta base CoreData de données de test.

    Il est bien plus adapté, pour les tests unitaires, d'avoir un MOC qui est lié à  un PersistentStore "InMemory", qui ne va vivre que pendant les tests car uniquement en RAM " t'assurant au passage que tes tests unitaires partent toujours d'un état propre et pas pollué ou dépendant de l'utilisation préalable de l'application qui aurait pu remplir ta base d'objets divers venant faire varier les résultats de tes tests "plutôt qu'utiliser un PersistentStore lié à  un fichier sqlite comme pour ton app, qui lui va persister d'un jeu de test a l'autre.
  • CéroceCéroce Membre, Modérateur

    1) le template d'Apple est de la merde. Crée une classe (par exemple CoreDataStack) et mets-y tout ce qui concerne la création de la pile Core Data.


     


    2) Ceci est une abomination:


     




    Afin de récupérer le contexte NSManagedObjectContext j'utilise la ligne suivante



    (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext!



     


     


    Tu rends toute ton appli dépendante de AppDelegate. Passe la Core Data Stack ou le ManageObjectContext au premier objet qui en a besoin. Ensuite, NSManagedObject comporte une propriété manageObjectContext.


  • CéroceCéroce Membre, Modérateur
    Grillé par Ali...
    Je suis totalement d'accord avec ce qu'il écrit. Notamment, on crée habituellement un store "in-memory" pour faire les tests.
  • MagiicMagiic Membre

    Ok très bien. Je vais suivre vos conseils. Merci !


Connectez-vous ou Inscrivez-vous pour répondre.