2010-12-15 73 views
1

J'ai suivi les instructions ici: http://www.grails.org/doc/latest/guide/7.%20Validation.htmlGrails validateable fonctionnent pas pour le domaine non-persistant classe

et a ajouté dans config.groovy:

grails.validateable.classes = [liningtest.Warm'] 

Ensuite, on ajoute src/Groovy/chaud. groovy (c'est une classe de domaine non persistant):

package liningtest 

import org.codehaus.groovy.grails.validation.Validateable 


class Warm { 
    String name; 
    int happyCite; 

    Warm(String n, int h) { 
    this.name = n; 
    this.happyCite = h; 
    } 

    static constraints = { 
    name(size: 1..50) 
    happyCite(min: 100) 
    } 
} 

Mais ce jus t ne fonctionne pas (les deux "blank false" & "size: 0..25") pour la fonction "hasErrors". Il renvoie toujours faux, même lorsque le nom est> 25.

Est-ce un bug Grails, si oui, y a-t-il des solutions de rechange?

J'utilise Grails 1.3.3

MISE À JOUR: J'ai mis à jour le code simplifié. Et maintenant je sais que la contrainte "taille" ne peut pas être utilisée avec "vide", mais ne fonctionne toujours pas.

Ma classe de test dans test/unit/liningtest/WarmTests.groovy

package liningtest 

import grails.test.* 

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

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

    void testSomething() { 
    def w = new Warm('Hihi', 3) 
    assert (w.happyCite == 3) 

    assert (w.hasErrors() == true) 
    } 
} 

Et l'erreur je suis arrivé:

<?xml version="1.0" encoding="UTF-8" ?> 
<testsuite errors="1" failures="0" hostname="evolus-50b0002c" name="liningtest.WarmTests" tests="1" time="0.062" timestamp="2010-12-16T04:07:47"> 
    <properties /> 
    <testcase classname="liningtest.WarmTests" name="testSomething" time="0.062"> 
    <error message="No signature of method: liningtest.Warm.hasErrors() is applicable for argument types:() values: [] 
Possible solutions: hashCode()" type="groovy.lang.MissingMethodException">groovy.lang.MissingMethodException: No signature of method: liningtest.Warm.hasErrors() is applicable for argument types:() values: [] 
Possible solutions: hashCode() 
    at liningtest.WarmTests.testSomething(WarmTests.groovy:18) 
</error> 
    </testcase> 
    <system-out><![CDATA[--Output from testSomething-- 
]]></system-out> 
    <system-err><![CDATA[--Output from testSomething-- 
]]></system-err> 
</testsuite> 

MISE À JOUR 2: Quand je ne me Test unitaire, mais essayez d'appeler hasErrors dans le contrôleur, il s'exécute mais retourne la valeur false. (hasErrors renvoie false avec Warm ('Hihi', 3)). Est-ce que quelqu'un a une idée?

MISE À JOUR 3: J'ai suivi la méthode Victor, et maintenant le problème est résolu si j'appelle validate() avant hasErrors(). Mais je ne comprends toujours pas, pourquoi les contrôleurs "grails generate-all" n'ont pas besoin d'appeler validate() avant d'utiliser hasErrors()?

+0

Avez-vous appelé validate() avant? Pouvons-nous avoir un code d'action complet? –

+0

Et aussi les propriétés de la classe User. –

+0

Je viens d'appeler la fonction hasErrors(), pas valider(). Oui, je vais mettre à jour la question bientôt. –

Répondre

4

Vous vraiment besoin d'appeler validate() avant - il déclenche la validation et changer d'état d'objet. En regardant ValidationGrailsPlugin.addValidationMethods(), je vois que hasErrors() est une méthode en lecture seule.

Votre exemple a fonctionné pour moi après avoir appelé validate(). J'ai essayé dans grails console (excellent outil, je vous recommande vivement!):

Warm w = new Warm('') 
w.hasErrors() // 'Result: false' 
w.validate() 
w.hasErrors() // 'Result: true' 

I ajouté @Validateable Warm classe. Je crois que cela ne fait aucune différence.

+0

Oui, cela fonctionne. Mais cela vous dérangerait-il d'expliquer pourquoi cela se produit? Je veux dire, par l'échafaudage de grails, ils appellent hasErrors sans appel pour valider()? –

+0

Je n'en ai aucune idée. Le grep rapide trouve les appels 'validate()' ou 'validateInstance()' uniquement dans le plugin WebFlow, pas dans les échafaudages ordinaires. Mais c'est un fait. –

+0

Maintenant, je comprends pourquoi cela fonctionne. Vous pouvez vérifier http://stackoverflow.com/questions/4544582/what-is-the-connection-between-validate-and-haserrors –

1

Je ne pense pas que les méthodes dynamiques validate() et hasErrors() sont ajoutées dans un test unitaire. Si vous passez à un test d'intégration, ils devraient être là.

+0

Maintenant, je lance hasErrors dans le contrôleur, et il ne signale pas les erreurs (quand il devrait signaler). Cela signifie que les méthodes existent, mais elles retournent la fausse valeur. –