通过grails测试,通过Controller中的Domain类访问db中的数据 [英] Accessing the data in db via Domain class in Controller via grails testing
问题描述
def index(){
// println params
字符串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)
{$ b ('''''''''')替换('#' ,'//')。replace('}',']'))
return matches
$ b private get_value(String key,default_value = null){
def app_preferences = get_preferences()
def result = app_preferences [key]
if(result == null){
result = default_value
}
返回结果
}
private get_preferences(布尔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)}
返回mapped_value
}
private static get_preference(AppPreferences首选项){
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。
我的测试代码如下所示:
pre $ $ $ c $ @TestFor(AppPreferencesController)
@Mock([AppPreferences])
//controller.session.SPRING_SECURITY_CONTEXT = [authentication:[principal:[id:'blah']]] $ b $ class AppPreferencesControllerSpec extends Specification {
def setup(){
def cleanup(){
}
/ * voidtest 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
}
}
响应.text正在返回为空。
在本地主机中,它返回一个散列值。
也许:
void test_for_index(){
when:
controller.session.SPRING_SECURITY_CONTEXT = [authentication:[principal:[id:'blah']] ]
controller.params.key ='role_to_feature_map'< - 附加到控制器的参数
controller.index()
then:
1 == 1
2 == 2
println response.text
}
测试通常运行针对与开发或生产不同的数据库。你的测试(我假设它是一个单元测试)将需要模拟你的AppPreferences域类。单元测试就是这样,只有被测试的代码单元。在测试的代码中没有Grails应用程序。
我可能会在当前测试中添加给定部分:并在AppPreferences域类中初始化实体。
给出:
def appPref1 = new AppPreferences(无论您必须设置为传递约束)。 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 ()))))
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
}
Here I am using AppPreferences domain . It is returning some value on localhost.But when I test it in grails it is returning Null. My test code as follows:
@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
}
}
the response.text is Returning as null. In local host it is returning a hash value.
Perhaps:
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
}
Tests typically run against a different database than development, or production. Your test (I assume it is a unit test) will need to mock your AppPreferences domain class. A unit test is just that, only the unit of code being tested. There isn't a Grails application surrounding the tested code.
I would probably add a given: section to the current test, and initialize the entities in the AppPreferences domain class there.
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
Personal opinion: The line of code below is unreadable. It would never pass code review where I work. Try a switch statement.
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()))))
这篇关于通过grails测试,通过Controller中的Domain类访问db中的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!