2010-12-15 11 views
1

のために動作しませvalidateable私はここで、命令に従っGrailsのは、非永続ドメインクラス

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

その後のsrc /グルーヴィー/ウォームに追加。

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

しかし、それはジュース:(それは非永続ドメインクラスです)グルーヴィー"hasErrors"機能に対して、tは機能しません(両方とも "空白false" & "size:0..25")。

これはGrailsのバグですか?はい、回避策はありますか?私はGrailsの1.3.3

UPDATEを使用してい

:私は単純化されたコードを更新しました。そして今、私は制約 "サイズ"を "空白"と一緒に使うことはできないが、それでも動作しないことを知っています。

テスト/ユニットでの私のテストクラス/ 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) 
    } 
} 

そして、私が得たエラー:

<?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:私は使用しませんユニットテストですが、コントローラー内でhasErrorsと呼ぶと、実行されますが偽の値が返されます。 (hasErrorsはWarm( 'Hihi'、3)でfalseを返します)。誰かが手掛かりを持っていますか?

UPDATE 3:私はビクターの方法に従いましたが、hasErrors()の前にvalidate()を呼び出すと問題が解決しました。しかし、私はまだ理解していない、なぜ、 "grails generate-all"コントローラがhasErrors()を使う前にvalidate()を呼び出す必要はないのですか?

+0

以前にvalidate()を呼び出しましたか?アクションコード全体を持つことはできますか? –

+0

また、Userクラスのプロパティ。 –

+0

私は単にvalidate()関数ではなく、hasErrors()関数を呼び出します。ええ、すぐに質問を更新します。 –

答えて

4

実際にはは、validate()に電話する必要があります。これにより、検証が開始され、オブジェクトの状態が変更されます。 ValidationGrailsPlugin.addValidationMethods()を見ると、hasErrors()は読み取り専用のメソッドであることがわかります。

あなたのサンプルは、validate()を呼び出してから私のために働いていました。私は(私は非常にお勧め、素晴らしいツール!)grails consoleで試してみました:

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

私は暖かいクラスに@Validateableを追加しました。違いはないと私は信じている。

+0

はい、動作します。しかし、なぜこれが起こるか説明してもらえますか?つまり、grails足場では、validate()を呼び出すことなくhasErrorsを呼び出します。 –

+0

私は実際には分かりません。クイックgrepは通常のスキャフォールディングではなく、WebFlowプラグインでのみ 'validate()'や 'validateInstance()'を呼び出します。しかしそれは事実です。 –

+0

今私はそれが動作する理由を理解します。 http://stackoverflow.com/questions/4544582/what-is-the-connection-between-validate-and-haserrors –

1

ユニットテストでvalidate()hasErrors()動的メソッドが追加されているとは限りません。これを統合テストに移行すれば、そこにいるはずです。

+0

これでコントローラのhasErrorsを実行しましたが、エラーを報告しません(報告する必要がある場合)。それはメソッドが存在することを意味しますが、それらは偽の値を返します。 –

関連する問題