1

私はここの指示に従いました:http ://www.grails.org/doc/latest/guide/7.%20Validation.html

config.groovyに追加:

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

次に、src / groovy / Warm.groovyに追加されます(これは非永続的なドメインクラスです)。

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」関数では機能しません(「空白false」と「サイズ:0..25」の両方)。名前が25より大きい場合でも、常にfalseを返します。

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

Grails1.3.3を使用しています

更新:簡略化されたコードを更新しました。そして今、私は制約「サイズ」が「空白」と一緒に使用できないことを知っていますが、それでも機能しません。

test / unit/ヴライニングテスト/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>

更新2:単体テストを使用せずに、コントローラーでhasErrorsを呼び出そうとすると、実行されますが、false値が返されます。(hasErrorsはWarm('Hihi'、3)でfalseを返します)。誰かが手がかりを持っていますか?

更新3:私はVictorの方法に従いましたが、hasErrors()の前にvalidate()を呼び出すと、問題は解決します。しかし、私はまだ理解していません。なぜ「grailsgenerate-all」コントローラーはhasErrors()を使用する前にvalidate()を呼び出す必要がないのですか?

4

2 に答える 2

4

本当に前に呼び出す必要があります-validate()検証をトリガーし、オブジェクトの状態を変更します。を見るとValidationGrailsPlugin.addValidationMethods()、hasErrors()が読み取り専用のメソッドであることがわかります。

あなたのサンプルはvalidate()を呼び出した後に私のために働いた。私は試してみましたgrails console(素晴らしいツール、私はそれを強くお勧めします!):

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

@Validateableウォームクラスに追加しました。違いはないと思います。

于 2010-12-22T13:50:03.670 に答える
1

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

于 2010-12-17T18:10:58.567 に答える