2

ユーザー ログインの典型的なコントローラー フローをテストしようとしています。ほとんどのログイン システムと同様に拡張関係があり、Grails のドキュメントはまったく役に立ちません。典型的な使用法に実際に関連する単一の例はなく、機能の完全な例です。

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

@TestFor(UserController)
class UserControllerTests extends GroovyTestCase {
    void testLogin() {
        params.login = [email: "test1@example.com", password: "123"]
        controller.login()
        assert "/user/main" == response.redirectUrl
    }
}

コントローラーは次のことを行います。

def login() {
    if (!params.login) {
        return
    }
    println("Email " + params.login.email)
    Person p = Person.findByEmail(params?.login?.email)
    ...
}

これは次のように失敗します:

groovy.lang.MissingMethodException: メソッドの署名がありません: immigration.Person.methodMissing() は引数の型に適用されます: () 値: []

println に正しいデータが表示されますが、メソッドの呼び出しに失敗します。

呼び出されるデータベース トリガーがあり、その結果をテストする必要があるため、テスト スイート全体でモックを使用することはできません。

奇妙なことに、テストでメソッドを直接呼び出すと機能しますが、コントローラーで呼び出すと機能しません。

更新について: grails コマンドから直接テストを再生成し、 @Test アノテーションを追加しました。

    @TestFor(UserController)
    class UserControllerTests extends GroovyTestCase {
        @Test
        void testLogin() {
            params.login = [email: "test1@example.com", password: "123"]
            Person.findByEmail(params.login.email)
            controller.login()
        }
    }

これは、 grail test-app -integration UserController で実行すると機能します

結果は正しく入力されませんが、応答は空です。flash.message には値があるはずなのに null です。redirectedUrl は null で、コンテンツの本文は空です。また、ビューも空です。

@TestFor アノテーションを削除すると、少しでも機能しなくなります。「params」が存在しないと言って失敗します。

別のテストでは、2 つの方法があります。最初のメソッドが実行され、Person.findAllByEmail() が検出されます。次に、2 番目のメソッドが実行され、Person.findAllByEmail が検出されず、同様のエラー (メソッドが見つかりません) でクラッシュします。

別の奇妙な更新では、応答オブジェクトがリダイレクトを送り返しているように見えますが、ユーザーコントローラーではなく、アプリケーションの baseUrl に送信されています。

4

2 に答える 2

6

統合テストでは を使用しないでください@TestFor。テストでコントローラーのインスタンスを作成し、その中にパラメーターを設定する必要があります。

class UserControllerTests extends GroovyTestCase {
  void testLogin() {
    def controller = new UserController()
    controller.params.login = [email:'test1@example.com', password:'123']
    controller.login()
    assert "/user/main" == controller.response.redirectedUrl
  }
}

詳細はユーザーガイドに記載されています。

于 2012-12-08T10:41:52.383 に答える
0

TestForアノテーションは構造をモックするため、単体テストでのみ使用されます。統合テストでは、完全な Grails 環境にアクセスできるため、このモックは必要ありません。したがって、注釈を削除するだけで機能するはずです。

class UserControllerTests extends GroovyTestCase {
...
}
于 2012-12-06T19:24:11.477 に答える