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 ()))))