2013-08-24 25 views
1

在Grails項目我期待在這裏,一個過濾器把域對象的請求......在請求把對象的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) 

} 

當我跑,我得到:

​​

所以它看起來像Grails將只讓我一個字符串或單個值和不喜歡我把一個對象的請求過濾器。即使你讓我在過濾器中使用相同的對象類型。

我真的很想測試這個功能測試。請幫忙。我使用的Grails 2.2.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) 
} 
+0

我要傳遞參數給控制器,以我的測試做任何有意義的 –

+0

不傳遞對象控制器。根據傳入的簡單值查找控制器中的對象。如果需要將對象傳遞到控制器以使測試正常工作,則需要重新考慮測試。 – Gregg

+0

謝謝但Filter正在傳遞給Controller的請求上設置一個對象。我需要模擬相同的請求。 –

相關問題