1

「The Definitive Guide to Grails (Second Edition)」の 104 ページからそのまま引用します。

void testLoginUserNotFound() {
    mockRequest.method = "POST"
    mockDomain(User)
    MockUtils.prepareForConstraintsTests(LoginCommand)
    def cmd = new LoginCommand(login:"fred", password:"letmein")

    cmd.validate()
    controller.login(cmd)

    assertTrue cmd.hasErrors()
    assertEquals "user.not.found", cmd.errors.login
    assertEquals "/store/index", renderArgs.view
}

このテストを実行すると、次のエラーで失敗します。

junit.framework.AssertionFailedError: junit.framework.AssertionFailedError: null

...その時点で「cmd」参照がnullになるまで追跡しました。アクション controller.login が呼び出される前は、cmd は有効で入力されていますが、その後は null です。

コマンド オブジェクトをテストするにはどうすればよいですか?

4

2 に答える 2

0

cmdではありませんnull。ただし、メッセージとともに をassertTrueスローします。デフォルトのメッセージ ( ) または状態のみを提供します。AssertionFailedErrornullassertTrue "default message", cmd.hasErrors()assert cmd.hasErrors()

cmd.hasErrors()それでは、 が を返す理由を見てみましょうfalse。- これは、カスタム バリデータが を返さずfalse、代わりにtrue「Groovy Truth」に従って評価される文字列を返すためです。(Grails API は、本が出版されてから変更されたようです。)

LoginCommandクラスでは、変更

login blank:false, validator:{ val, cmd ->
    if(!cmd.user)
        return "user.not.found"
}

login blank:false, validator:{ val, cmd ->
    if(!cmd.user)
        return false
}

すると、エラーコードは「LoginCommand.login.validator」になります。
カスタム エラー コードが必要な場合は、次のように (何も返さずに) 自分でエラー オブジェクトを追加できます。

login blank:false, validator:{ val, cmd ->
    if(!cmd.user)
        cmd.errors.rejectValue('login', 'user.not.found')
}

PS:クラスを直接使用するのではMockUtilsなく、代わりにextend GrailsUnitTest. また、MockUtils.prepareForConstraintsTests(Class)非推奨です。さらに、コマンド オブジェクトには適していません。-mockForConstraintsTests(Class)から継承されたメソッドを代わりに使用してくださいGrailsUnitTest

于 2010-11-03T16:22:41.123 に答える
0

このメソッドをコントローラーの単体テストで使用して、コマンド オブジェクトの配管を追加します。

  private def invoke(String action) {
    def types = controller."$action".parameterTypes
    if (types && types.length == 1) {
      Class cmdClass = types[0]
      mockCommandObject(cmdClass)
      def cmd = cmdClass.newInstance()
      controller.params.each{ key, value ->
        try{ cmd."$key" = value } catch(MissingPropertyException ex){}
      }
      cmd.validate()
      controller."$action"(cmd)
    } else {
      controller."$action"()
    }
  }

テストは次のようになります。

    setup:
    controller.params.contractNum = "invalid"


    when:
    invoke "lookup"
于 2011-11-18T20:57:12.980 に答える