2010-05-20 5 views
1

J'ai deux questions de test. Les deux sont probablement faciles à répondre. Le premier est que j'ai écrit ce test unitaire dans Grails:Grails Test hickups

void testCount() { 
    mockDomain(UserAccount) 

    new UserAccount(firstName: "Ken").save() 
    new UserAccount(firstName: "Bob").save() 
    new UserAccount(firstName: "Dave").save() 

    assertEquals(3, UserAccount.count()) 
} 

Pour une raison quelconque, je reçois 0 retourné. Ai-je oublié de faire quelque chose?

EDIT: OH, je comprends. Les contraintes de validation ont été violées, elles n'ont donc pas été stockées. Yat-il un moyen d'obtenir des commentaires ici? C'est une chose vraiment merdique d'arriver ...

La deuxième question s'adresse à ceux qui utilisent IDEA. Que devrais-je courir - les tests de junit d'IDEA, ou les cibles de grails? J'ai deux options.

En outre, pourquoi IDEA dit-il que mes tests réussissent et qu'il fournit un feu vert même si le test ci-dessus échoue réellement? Cela va vraiment me rendre fou si je dois vérifier les rapports de test en html chaque fois que je cours mes tests .....

Aide?

Répondre

2

Je fais toujours object.save(failOnError: true) dans les tests pour éviter les défaillances silencieuses comme celle-ci. Cela provoque une exception si la validation échoue. Même sans base de données réelle dans un test unitaire, la plupart des contraintes seront vérifiées, bien que je préfère utiliser des tests d'intégration si je veux tester des relations complexes entre des objets de domaine.

+0

Y at-il un moyen d'obtenir ce comportement par défaut sans avoir à le passer encore et encore lors des tests unitaires?Une partie du problème avec l'obtention des tests est de s'assurer que les objets que vous construisez juste pour tester autre chose peuvent être une énorme douleur et ruiner la productivité. Man, cela aurait dû être totalement le défaut. Ça me fait penser, à quoi pensaient-ils? :( – egervari

+0

Ajoutez la ligne 'grails.gorm.failOnError = true' à Config.groovy pour en faire la ligne par défaut. – ataylor

1

Personnellement, je n'ai pas trouvé les tests Idea JUnit particulièrement utiles lorsque vous travaillez avec des grails. Il est probablement bon d'utiliser le testeur pour les tests "Unit". Pour les tests d'intégration, vous pouvez envisager de configurer une cible ant en mode «debug» pour exécuter vos tests. Au fil du temps, les tests en cours commencent à prendre tant de temps que j'ai tendance à les exécuter exclusivement à partir de la ligne de commande pour éviter les frais supplémentaires qu'IntelliJ ajoute.

En ce qui concerne votre test unitaire, je suis à peu près certain que vous devrez effectuer un test d'intégration pour obtenir un compte différent de zéro. Je ne suis pas sûr de ce que l'unité test votre utilisation exactement mais puisque GORM n'est pas amorcé dans les tests unitaires je ne suis pas sûr que l'objet de domaine mocking soutient l'incrément d'un compte.

Votre test passerait probablement comme test d'intégration à condition que vos objets de domaine soient validés.

+0

Je pense que le manque de tests de fonctionnement dans mon esprit va vraiment être un problème pour moi. Je suis un fanatique de test. Je veux des cycles de test très rapides. Je suis habitué à travailler sur des projets où plus de 1000 tests ne prennent que 10 à 20 secondes, et je n'ai même pas utilisé de mock (ce sont tous des tests d'intégration, parce que je ne suis pas fan de moquerie). Il semble que l'amorçage de grails prend 10 secondes à lui seul pour exécuter 1 test. C'est plutôt décevant. Je ne suis pas un expert des rails ... mais les rails ont aussi beaucoup plus de temps pour tourner ici, non? Je suis juste en train de décider quel cadre utiliser. Je les apprends tous un peu. – egervari

0

add flush: true pour votre méthode de sauvegarde. Grails définit le mode de vidage de la session de mise en veille prolongée sur manuel. Ainsi, la modification n'est pas conservée après le retour de l'action mais avant que la vue ne soit rendue. Cela permet aux vues d'accéder à des collections et à des relations paresseuses et d'empêcher la persistance automatique des modifications.