我是单位/整合/功能测试的新手。我在Grails 3.1.7中使用Spock进行集成测试并遇到问题:
我的域类的自定义验证程序适用于已启动的应用程序和grails控制台,但在测试运行期间无效。
我有2个类似的验证器用于2个域类,其中一个通过,另一个没有。
此验证的主要思想是用户可能有2封电子邮件。一个用于登录,另一个用于显示在配置文件中。用户无法选择其他用户的电子邮件显示在个人资料中(相反)。
通过相应测试的那个(应用于用户域类中的电子邮件):
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会有帮助吗?
答案 0 :(得分:0)
问题是由模拟的依赖域对象之间的不正确交互引起的。在我的情况下,UserProfile属于User,如果您更改UserProfile但从用户检索它 - 您将得到一个惊喜(验证将无效)。
有些信息可以在这里找到:Unit test grails with domain objects using GORM functions