2010-08-19 17 views
1

J'apprends des grails de Grails - pour commencer par le livre de Jason Rudolph. Ma classe de domaine ressemble que:Grails - test de validateur personnalisé sur un numéro de classe de domaine

class Race { 

    String name; 
    Date startDateTime 
    String city 
    String state 
    Float distance 
    Float cost 
    Integer maxRunners = 10000 

    static hasMany = [registrations: Registration] 

    static constraints = { 
    name(maxSize: 50, blank: false) 
    startDateTime(validator: { 
     return it > new Date() 
    }) 
    city(maxSize: 30, blank: false) 
    state(inList: ['GA', 'NC', 'SC', 'VA'], blank: false) 
    distance(min: 3.1f, max: 100f) 
    cost(min: 0f, max: 999.99f) 
    } 

    String toString() { "${this.name} : ${this.city}, ${this.state}" } 
} 

Je veux tester la validation personnalisée de champ dateTime. Le test ressemble à cela:

class RaceTests extends GrailsUnitTestCase { 
    protected void setUp() { 
    super.setUp() 
    } 

    protected void tearDown() { 
    super.tearDown() 
    } 

    void testCustomDateValidation() { 
    def race = new Race() 
    race.startDateTime = null 
    assertFalse(race.validate()) 
    } 
} 

Le test ressemble à celui du livre que j'ai mentionné plus tôt. Mais je reçois

groovy.lang.MissingMethodException: No signature of method: racetrack.Race.validate() is applicable for argument types:() values: [] 

Je suis coincé et je n'ai trouvé aucune solution:/Toute aide sera appréciée.

+0

Vous mentionnez que vous utilisez le livre de Jason Rudolph, donc je suppose que vous utilisez la 1ère édition. Ceci est très daté et vous devriez utiliser la 2ème édition qui est également gratuite: http://www.infoq.com/minibooks/grails-getting-started –

+0

Yup, comme il s'est avéré que j'utilisais l'ancienne édition - je savais il y avait la deuxième édition, mais j'ai oublié de le télécharger: P – jjczopek

Répondre

3

Vous ne devriez pas utiliser les tests unitaires ou se moquant de tester les classes de domaine. Grails crée un test unitaire pour les classes de domaine et cela devrait être changé. Déplacez la classe vers le même package et le même dossier sous test/intégration et remplacez la classe de base par GroovyTestCase. Un test approprié s'exécutera avec la base de données en mémoire et testera la persistance, et non le cadre de simulation.

+0

Je suppose que la logique est que le moqueur ne fournit pas le même comportement que la vraie DB. L'inconvénient est que les tests unitaires sont beaucoup plus rapides que les tests d'intégration. Pour les tests d'intégration TDD, IMHO est trop lent. Je vais donc m'en tenir aux tests unitaires ici. –

+0

@Burt Beckwith, pouvez-vous fournir un raisonnement derrière votre affirmation selon laquelle le test/dérochage unitaire ne devrait pas être utilisé pour tester les classes de domaine? C'est une déclaration troublante puisque j'ai tellement de tests à faire. Plus inquiétant (comme vous l'avez souligné) est que Grails crée automatiquement un test unitaire pour les classes de domaine. De plus, Grails in Action chapitre 7.2.1 dit spécifiquement d'utiliser le test unitaire pour tester les contraintes de classe de domaine. Si nous ne devrions vraiment pas utiliser les tests unitaires pour tester les classes de domaine, j'espère que ces choses seront corrigées plus tôt que plus tard pour éviter toute confusion inutile. – ubiquibacon

+0

[Grails in Action chapitre 7] (http://www.manning.com/gsmith/SampleChapter7.pdf) – ubiquibacon