想象一下,有一个表单可以对一组登录及其状态进行批量更新;使用的逻辑是关于有一个隐藏的字段,它跟踪所有可能的id和一组...电台btns。稍后通过服务,激活我们列表中的任何已检查ID并停用休息:
def enabledLogins = toList(params.enabledLogins)
def allLoginIds = params.allLoginIds.toString().split(',')
loginService.updateLoginStatus(allLoginIds,enabledLogins)
这是服务的定义
def updateLoginStatus(String[] allLoginIds, List<Long> enabledLoginIds) {
for (item in allLoginIds) {
def login = Login.get(item.toLong())
if (login) {
login.enabled = enabledLoginIds.contains(item.toLong()) ? true : false
login.save()
if (login.hasErrors()) {
login.errors.each { log.error(it) }
}
}
}
}
这是集成测试:
def testUpdateLoginStatus() {
def id1 = createLogin().id
def id2 = createLogin().id
String[] allLoginIds = [id1 as String, id2 as String]
List<Long> enabledLoginIds = [id1]
loginService.updateLoginStatus(allLoginIds, enabledLoginIds)
def login1 = Login.get(id1)
def login2 = Login.get(id2)
assertTrue login1.enabled
assertFalse login2.enabled
}
Login createLogin() {
def now = System.currentTimeMillis()
def email = "int-test-" + now + "@somewhere.com"
def password = "Pwd" + now + "pwD"
def login = new Login(username: email, password: password, firstName: "Integration", lastName: "Test")
login.save(flush: true)
assertNotNull login.id
return login
}
现在问题在于:
上面的代码只是通过了集成测试,但没有在实践中工作,除非我从
enabledLoginIds.contains(item.toLong())中取出 toLong ,在这种情况下集成测试失败... 所以某种某种地方的类型是错误的......但是我看不到它了,谢谢你们:Ps:grails 1.3.7
答案 0 :(得分:0)
所有参数都以字符串形式出现,因此Controller中的代码为:
def enabledLogins = toList(params.enabledLogins)
这是创建字符串列表。这就是为什么如果你在运行应用程序时取出.toLong()它就可以了。因为它正在做:
["1", "2"].contains("1")
而不是使用.toLong的当前实现,这将导致:
["1", "2"].contains(1)
我在这里看到了几件事:
1)请记住,泛型只是编译时间(因此在groovy中基本上没有价值)。因此,即使您的方法签名中有一个(... , List<Long> enabledLoginIds)
参数。在运行时,无法保证它将是Longs列表。
2)我通常通过控制器进行集成测试。这样可以为您提供更好的端到端测试,并有助于避免此类问题。如果它通过测试,但在生产中不起作用,那么你认为测试有问题。