1

私がここで見ているGrailsプロジェクトでは、フィルターはリクエストにドメインオブジェクトを置きます...

class TokenFilters {

    def filters = {

        all( uri: '/hiphop/**' ) {

            before = {
                MyToken myToken = ...
                request.myToken = myToken

MyToken は次のようになります。

class MyToken {
    String id
    String token
    static mapping = {
        token( index:  true )
        id( generator: 'uuid' )
    }
    ...
 }

私のコントローラーでは、myToken がリクエストから取り出されます。

MyController {
    myaction {
        MyToken accessToken = request.myToken

大丈夫だ。コントローラーの統合テストを作成したいと考えています。

@Test
void testLogin() {
    def mc = new MyController()    
    def myToken = new MyToken(1234);
    // set the request parameters
    mc.request.parameters = [myToken:myToken];
    def message = mc.action();
    assertTrue(message.indexOf("trans") > 0)

}

これを実行すると、次のようになります。

Failure:  testLogin(MyTests)
|  java.lang.IllegalArgumentException: Parameter map value must be single value  or array of type [java.lang.String]
    at testLogin(MyTests.groovy:40)

したがって、Grails は文字列または単一の値しか許可しないようで、フィルターでリクエストにオブジェクトを配置するのは好きではありません。でも、同じオブジェクト タイプをフィルターに入れることができます。

機能テストに行かずにこれをテストしたいと思います。助けてください。Grails 2.2.1 を使用しています

ありがとう

4

1 に答える 1

3

問題は、コードがコントローラーにパラメーターを渡していることです。オブジェクトを処理できない HTTP リクエストをエミュレートしています。あなたができることは次のとおりです。

mc.request.parameters = [myToken: '1234']

次に、コントローラー/フィルターが1234を引き出してMyTokenを検索します。コントローラーの転送をテストしていた場合は、オブジェクトをリクエストに入れることができます。その逆ではありません。

問題の一部は、フィルターからのデータを想定しているコントローラーをテストしようとしていることにあることがわかりました。

一部のコードを省略しましたが、ControllerUnitTestCase を拡張すると仮定すると、モック リクエスト オブジェクトにアクセスできます。あなたは簡単にできるはずです:

@Test
void testLogin() {
    def mc = new MyController()    
    def myToken = new MyToken(1234);
    // set the request parameters
    request.myToken = myToken
    def message = mc.action();
    assertTrue(message.indexOf("trans") > 0)
}
于 2013-08-24T17:39:51.163 に答える