2010-12-15 10 views
1

Ich folgte den Anweisungen hier: http://www.grails.org/doc/latest/guide/7.%20Validation.htmlGrails validateable nicht für nicht-persistente Domain-Klasse arbeiten

und ergänzt in config.groovy:

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

dann in src/groovy/Warm hinzugefügt. groovy (es ist ein nicht-persistent Domain-Klasse):

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) 
    } 
} 

Aber es jus t funktioniert nicht (beide "leer falsch" & "Größe: 0, 25") für die "hasErrors" -Funktion. Es gibt immer false zurück, auch wenn der Name> 25 ist.

Ist das ein Grails-Bug, wenn ja, gibt es einen Workaround?

Ich bin mit Grails 1.3.3

UPDATE: Ich habe den vereinfachten Code aktualisiert. Und jetzt weiß ich, dass Einschränkung "Größe" nicht mit "leer" verwendet werden kann, aber immer noch nicht funktioniert.

Meine Testklasse in Test/Einheit/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) 
    } 
} 

Und die Fehler, die ich bekam:

<?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> 

UPDATE 2: Wenn ich nicht verwenden Unit-Test, aber versuchen, hasErrors im Controller aufzurufen, es läuft aber false-Wert zurück. (hasErrors geben false mit Warm ('Hihi', 3) zurück). Hat jemand eine Ahnung?

UPDATE 3: Ich folgte Victor Weg, und jetzt ist das Problem gelöst, wenn ich validate() vor hasErrors() aufrufen. Aber ich verstehe immer noch nicht, warum "grails generate-all" controller nicht validate() aufrufen muss, bevor hasErrors() verwendet wird?

+0

Haben Sie vorher validate() aufgerufen? Können wir den ganzen Aktionscode haben? –

+0

Und auch die Eigenschaften der Benutzerklasse. –

+0

Ich rufe nur hasErrors() -Funktion, nicht validate(). Ja, ich werde die Frage bald aktualisieren. –

Antwort

4

Sie wirklich müssen vorher validate() aufrufen - es wird Validierung auslösen und Objektstatus ändern. Betrachtet man ValidationGrailsPlugin.addValidationMethods(), sehe ich, dass hasErrors() eine schreibgeschützte Methode ist.

Ihre Probe funktionierte für mich nach dem Aufruf von validate(). Ich habe versucht, in grails console (großes Werkzeug, ich kann es nur empfehlen!):

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

I @Validateable hinzugefügt Klasse warm. Ich glaube, es macht keinen Unterschied.

+0

Ja, es funktioniert. Aber würde es Ihnen etwas ausmachen zu erklären, warum das passiert? Ich meine, am Gralsgerüst rufen sie hasErrors ohne jede Aufforderung zu validieren() auf? –

+0

Ich habe eigentlich keine Ahnung. Quick Grep findet 'validate()' oder 'validateInstance()' Aufrufe nur im WebFlow-Plugin, nicht im normalen Scaffolding. Aber es ist eine Tatsache. –

+0

Jetzt verstehe ich, warum es funktioniert. Vielleicht möchten Sie http://stackoverflow.com/questions/4544582/what-is-the-connection-between-validate-and-haserrors überprüfen –

1

Ich glaube nicht, dass die dynamischen Methoden validate() und hasErrors() in einem Komponententest hinzugefügt werden. Wenn Sie dies zu einem Integrationstest verschieben, sollten sie da sein.

+0

Jetzt führe ich hasErrors in der Steuerung aus, und es meldet keine Fehler (wenn es melden sollte). Es bedeutet, dass die Methoden existieren, aber sie geben den falschen Wert zurück. –

Verwandte Themen