0
def index() { 
    //println params 
    String params_key =params['key'] 
    def c = get_value(params_key) 
    def resp = ['key': params_key, 'value':c] 
    render resp as JSON 
} 
private static hash_conv(String value) 
{ 
    def matches = Eval.me(value.replace(':','').replace('{','[').replace('=>',':').replace('#','//').replace('}',']')) 
    return matches 
} 

private get_value(String key, default_value=null){ 
    def app_preferences = get_preferences() 
    def result = app_preferences[key] 
    if (result == null) { 
    result = default_value 
    } 

    return result 
} 

private get_preferences(Boolean mobile_app = false){ 
    def all_app_preference = AppPreferences.all 
    def mapped_value = [:] 
    def all_app = all_app_preference.each{obj -> mapped_value << get_preference(obj)} 
    return mapped_value 
} 

private static get_preference(AppPreferences preference){ 
    def value_type = preference.value_type.toLowerCase() 
    def val = value_type == 'integer' ? preference.value.toBigInteger() : (value_type == 'boolean' ? (preference.value == 'true' || preference.value == '1' ? true : false):(value_type == 'array' ? preference.value.split(',') : (value_type == 'hash' ? hash_conv(preference.value) :(value_type == 'json' ? new JsonSlurper().parseText(preference.value) : preference.value.toString())))) 
    def map_value = [:] 
    map_value[preference.preference_key] = val 
    return map_value 
} 

這裏我使用AppPreferences域。它在localhost上返回一些值,但是當我在grails中測試它時,它返回Null。 我的測試代碼如下:在控制器中通過grails測試訪問db中的數據通過grails測試

@TestFor(AppPreferencesController) 
@Mock([AppPreferences]) 
//controller.session.SPRING_SECURITY_CONTEXT = [authentication:[principal:[id: 'blah']]] 
class AppPreferencesControllerSpec extends Specification { 

    def setup() { 
    } 

    def cleanup() { 
    } 

    /*void "test something"() { 
     expect:"fix me" 
      true == false 
    }*/ 
    void test_for_index() 
    { 
     when: 
      controller.session.SPRING_SECURITY_CONTEXT = [authentication:[principal:[id: 'blah']]] 
      params.key = 'role_to_feature_map' 
      controller.index() 
     then: 
      1 == 1 
      2 == 2 
      println response.text 
    } 
} 

的response.text被返回爲空。 在本地主機中,它返回一個散列值。

+0

AppPreferences是否在測試設置過程中被填充到某處?如果沒有,則不會有任何數據並返回null。 –

+0

沒有它沒有填充。但我對grails很陌生,怎麼做?我需要通過從db獲取值來完成。 –

+0

你可以這樣做是你的設置()例如新AppPreferences(字段1:「胡說」).save(failOnError:真,同花順:真) –

回答

0

也許:

void test_for_index() { 
    when: 
     controller.session.SPRING_SECURITY_CONTEXT = [authentication:[principal:[id: 'blah']]] 
     controller.params.key = 'role_to_feature_map' <-- the params attached to the controller 
     controller.index() 
    then: 
     1 == 1 
     2 == 2 
     println response.text 
} 

測試通常運行鍼對不同的數據庫開發或生產。你的測試(我假設它是一個單元測試)將需要模擬你的AppPreferences域類。單元測試就是這樣,只有被測試的代碼單元。圍繞測試代碼沒有Grails應用程序。

我可能會在當前測試中添加一個給定的部分,並在那裏初始化AppPreferences域類中的實體。

given: 
    def appPref1 = new AppPreferences("whatever you must set to pass constraints").save(flush:true) 
    controller.session.SPRING_SECURITY_CONTEXT = [authentication:[principal:[id: 'blah']]] 
    controller.params.key = 'role_to_feature_map' 

when: 
    controller.index() 

then: 
    1 == 1 
    2 == 2 
    println response.text 

個人觀點:下面的代碼行是不可讀的。它永遠不會在我工作的地方通過代碼審查。嘗試一個switch語句。

def val = value_type =='integer'? preference.value.toBigInteger():(value_type ==''boolean'?(preference.value =='true'|| preference.value =='1'?true:false):(value_type =='array'?preference .value.split(','):(value_type =='hash'?hash_conv(preference.value):(value_type =='json'?new JsonSlurper()。parseText(preference.value):preference.value.toString ()))))