我是单元/集成/功能测试的新手。我在Grails 3.1.7中使用Spock进行集成测试,但遇到了一个问题:
我为我的域类提供了一个自定义验证器,该验证器可用于启动的应用程序和grails控制台,但不适用于测试运行期间。
我有2个域类的2个类似的验证器,其中一个通过了,另一个通过-没有。
此验证的主要思想是用户可能有2封电子邮件。一个用于登录,另一个用于显示在个人资料中。用户无法选择要在个人资料中显示其他用户的电子邮件(反之亦然)。
通过相应测试的一项(适用于User域类中的电子邮件):
validator: {email, user ->
UserProfile userProfile = UserProfile.findByProfileEmail(email)
if (!userProfile) {
true
} else if (userProfile?.user == user) {
true
} else {
false
}
}
另一个相同,但是检查了用户的个人资料电子邮件(应用于UserProfile域类中的profileEmail):
validator: {profileEmail, userProfile ->
User user = User.findByEmail(profileEmail)
if (!user) {
true
} else if (user?.userProfile == userProfile){
true
} else {
false
}
}
测试中的代码示例:
def setup() {
userService.createUser(email: EMAIL, password: PASSWORD, firstName: FIRST_NAME)
springSecurityService.reauthenticate(EMAIL, PASSWORD)
}
void "Attempt to set non-unique profileEmail"() {
given: "Create additional user"
userService.createUser(email: EMAIL_ADDITIONAL, password: PASSWORD, firstName: FIRST_NAME)
when: "Set user's profile email the same as additional user's email"
userProfileService.updateUserProfile([profileEmail: EMAIL_ADDITIONAL])
then: "Check that non-unique profileEmail was not saved"
User.findByEmail(EMAIL).userProfile.profileEmail != EMAIL_ADDITIONAL
}
我的自定义验证程序以某种方式适用于控制台和正在运行的应用程序,但不适用于集成测试。
可能需要更多来自服务或域类的代码示例吗?到github repo的链接会有所帮助吗?
最佳答案
该问题是由模拟的依赖域对象之间的不正确交互引起的。在我的情况下,UserProfile属于User,如果您更改了UserProfile,但随后又从User中检索了它,那么您会感到惊讶(验证无效)。
一些信息可以在这里找到:Unit test grails with domain objects using GORM functions
关于validation - Grails项目中集成测试的Spock验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945766/