gpt4 book ai didi

unit-testing - Grails使用Spring Security Core插件测试用户角色自定义验证约束

转载 作者:行者123 更新时间:2023-12-02 14:38:01 26 4
gpt4 key购买 nike

我确信这是一个相当普遍的情况。我正在使用Spring Security Core插件,并想创建一个Person仅限于某些角色的域模型:

class Workgroup {

Person manager
...

static constraints = {
manager(validator: {mgr ->
// it feels like there should be a more elegant, groovy way of doing this.
def auths = mgr.getAuthorities();
def returny = false
auths.each {
if(it.authority == 'ROLE_MANAGER')
{
returny = true
}
}
return returny
})
}

}

该测试像Mofo一样失败:
void testInvalidManager() {
def nick = new Person(username:'Nick')
def nonManagerRole = new Role(authority:'ROLE_EMPLOYEE')
UserRole.create(nick,nonManagerRole)
def awesome = new Workgroup(name:'mooCows', manager:nick)
mockForConstraintsTests(Workgroup, [awesome])
assertFalse awesome.validate()
assertEquals "validator", awesome.errors["manager"]
}

testInvalidManager错误没有方法签名:users.UserRole.save()适用于参数类型:(java.util.LinkedHashMap)值:[[flush:false,insert:true]]可能的解决方案:wait(),any() ,wait(long),use([Ljava.lang.Object;),isCase(java.lang.Object),each(groovy.lang.Closure)

groovy.lang.MissingMethodException:没有方法签名:users.UserRole.save()适用于参数类型:(java.util.LinkedHashMap)值:[[flush:false,insert:true]]
可能的解决方案:wait(),any(),wait(long),use([Ljava.lang.Object;),isCase(java.lang.Object),each(groovy.lang.Closure)
在users.UserRole.create(UserRole.groovy:32)
在users.UserRole.create(UserRole.groovy)
at users.UserRole $ create.call(未知来源)
在users.WorkgroupTests.testInvalidManager(WorkgroupTests.groovy:17)

集成比单元测试更好地涵盖了这一点吗?我是否需要模拟UserRole(如果是,怎么做?)?这些类型的测试通常如何进行?

最佳答案

UserRole.create()调用save(),因此您需要使用mockDomain()而不是mockForConstraintsTests()

但是,只有在您可以使用模拟测试域模型的情况下,这是我永远不会做的。在测试Controllers或其他使用域类但又不因真正的持久性而烦扰,创建数据库(甚至是内存中的数据库)等时,应使用Grails中的模拟支持。当前层,并相信其他层已经过正确测试。但是,当您使用模拟测试域类时,您实际上只是在测试模拟框架。因此,我始终对域类使用集成测试,以便它们在真实数据库上运行。

为了回答您的代码示例中的隐式问题,我将约束写为

static constraints = {
manager validator: { mgr ->
mgr.authorities.find { it.authority == 'ROLE_MANAGER' } != null
}
}

大量使用的问题是,在常规的for循环更可取时,您将使用each(),因为您可以从for循环返回。仅在确实要在每个实例上调用闭包时才使用each()。这是一个比另一个不那么花哨的东西,但是使用了for循环:
static constraints = {
manager validator: { mgr ->
for (auth in mgr.getAuthorities()) {
if (it.authority == 'ROLE_MANAGER') {
return true
}
}
return false
}
}

关于unit-testing - Grails使用Spring Security Core插件测试用户角色自定义验证约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5844656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com