我相信這是一個相當常見的情況。我使用Spring Security的核心插件,並希望創建一個具有限於某些角色的一個人域模型:Grails使用Spring Security Core Plugin測試用戶角色自定義驗證約束條件
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
})
}
}
測試失敗像美富:
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)values:[[flush:false,insert:true]] 可能解決方案:在users.UserRole.create上使用wait(),any(),wait(long),use([Ljava.lang.Object;),isCase(java.lang.Object),each(groovy.lang.Closure) (UserRole.groovy:32) 在users.UserRole.create(UserRole.groovy) 在users.UserRole $ create.call(未知來源) 在users.WorkgroupTests.testInvalidManager(WorkgroupTests.groovy:17)
集成比單元測試更好地涵蓋了這一點嗎?我是否需要模擬UserRole(如果有,如何?)?這些類型的測試通常如何進行?
這必須是另一個問題或Grails的用戶討論的話題,但你爲什麼不測試領域類加入了'mockDomain()' ?例如,我的域邏輯包括幾個'findBy *()',而不是'parent.children.find {}' - 爲什麼它可能不好? 我對你的意見非常感興趣,因爲我知道你在Grails中的角色。 – 2011-05-01 06:30:40
您應該使用mockForConstraintsTests測試域類,以驗證您的域約束。否則,您使用mockDomain提供域對象,這些域對象的行爲與正確的域對象相同,因此可以針對它們測試服務和控制器。 – 2011-05-01 17:35:33