2010-05-17 158 views
6

我有一個控制器方法,就像這樣:單元測試控制器方法?

def search = { 
    def query = params.query 

      ... 

    render results as JSON 
} 

我如何單元測試呢?具體來說,如何調用搜索來設置params.query,以及如何測試方法render的結果?也許有辦法模擬渲染方法嗎?

回答

5

子類grails.test.ControllerUnitTestCase爲您的單元測試。 Grails會自動實例化您的控制器並模擬渲染和重定向的版本,以便您輕鬆測試結果。只需將測試輸入分配給controller.params即可設置測試。

例子:

class SomethingController { 
    def search = { 
     def query = params.query 
     ...stuff... 
     render results as JSON 
    } 
} 

測試看起來像:

class SomethingControllerTests extends grails.test.ControllerUnitTestCase { 
    void testSearch() { 
     controller.params.query = "test query" 
     controller.search() 
     assertEquals "expected result", controller.response.contentAsString 
    } 
} 

注意:您可以使用ControllerUnitTestCase集成測試過,如果你需要一個完整的集成環境中完整的數據庫。

0

有兩種方法可以對控制器進行單元測試,但需要對其進行一些更改。

首先是單元測試控制器本身,而不會增加http解析的複雜性,所以你可以編寫你的單元測試並作爲單元測試的一部分傳入params.query,因此,將搜索功能分解爲兩個功能:

def search = { 
    def query = params.query 
    render realSearch(query) as JSON 
} 

def realSearch ... 

所以,第一部分測試realSearch

然後第二部分是編寫一個應用程序,它將實際連接到您的Web應用程序,並執行功能測試,它將測試您的整個應用程序,包括未在第一部分中測試的控制器部分。

0

TFMGrails ref chapter 9

按照testCreateWithJSON()例子...只是把這些東西您的查詢字符串到PARAMS [ '查詢'],設置的contentType,呼叫搜索()。由於你明確地調用了渲染,所以最重要的事情是查看response.contentAsString ...我可能只是對contentAsString進行模式匹配斷言;你可以將它重新解析爲JSON,然後檢查該對象樹,但我懷疑這不會像簡單的模式匹配斷言那樣清晰/快速。