grails:list.contains在代码与集成测试中的行为

时间:2012-01-19 14:52:25

标签: list grails integration-testing

想象一下,有一个表单可以对一组登录及其状态进行批量更新;使用的逻辑是关于有一个隐藏的字段,它跟踪所有可能的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

1 个答案:

答案 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)我通常通过控制器进行集成测试。这样可以为您提供更好的端到端测试,并有助于避免此类问题。如果它通过测试,但在生产中不起作用,那么你认为测试有问题。