我有一個控制器方法,就像這樣:單元測試控制器方法?
def search = {
def query = params.query
...
render results as JSON
}
我如何單元測試呢?具體來說,如何調用搜索來設置params.query
,以及如何測試方法render
的結果?也許有辦法模擬渲染方法嗎?
我有一個控制器方法,就像這樣:單元測試控制器方法?
def search = {
def query = params.query
...
render results as JSON
}
我如何單元測試呢?具體來說,如何調用搜索來設置params.query
,以及如何測試方法render
的結果?也許有辦法模擬渲染方法嗎?
子類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集成測試過,如果你需要一個完整的集成環境中完整的數據庫。
有兩種方法可以對控制器進行單元測試,但需要對其進行一些更改。
首先是單元測試控制器本身,而不會增加http解析的複雜性,所以你可以編寫你的單元測試並作爲單元測試的一部分傳入params.query,因此,將搜索功能分解爲兩個功能:
def search = {
def query = params.query
render realSearch(query) as JSON
}
def realSearch ...
所以,第一部分測試realSearch
。
然後第二部分是編寫一個應用程序,它將實際連接到您的Web應用程序,並執行功能測試,它將測試您的整個應用程序,包括未在第一部分中測試的控制器部分。
按照testCreateWithJSON()例子...只是把這些東西您的查詢字符串到PARAMS [ '查詢'],設置的contentType,呼叫搜索()。由於你明確地調用了渲染,所以最重要的事情是查看response.contentAsString ...我可能只是對contentAsString進行模式匹配斷言;你可以將它重新解析爲JSON,然後檢查該對象樹,但我懷疑這不會像簡單的模式匹配斷言那樣清晰/快速。