Grails 项目中集成测试的 Spock 验证问题
Spock validation issues for integration tests in grails project
我是 unit/integration/functional 测试的新手。我在 Grails 3.1.7 中使用 Spock 进行集成测试并遇到问题:
我有一个针对我的域的自定义验证器 classes,它既适用于启动的应用程序,也适用于 grails 控制台,但在测试期间无效 运行。
我有 2 个类似的验证器用于 2 个域 classes,其中一个通过,另一个 - 没有。
此验证的主要思想是用户可能有 2 个电子邮件。一个用于登录,另一个用于在个人资料中显示。用户不能选择其他用户的电子邮件地址显示在个人资料中(反之亦然)。
通过相应测试的(应用于用户域class中的电子邮件):
validator: {email, user ->
UserProfile userProfile = UserProfile.findByProfileEmail(email)
if (!userProfile) {
true
} else if (userProfile?.user == user) {
true
} else {
false
}
}
另一个是相同的,但检查了用户的个人资料电子邮件(应用于 UserProfile 域 class 中的个人资料电子邮件):
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
}
我的自定义验证器以某种方式适用于控制台和 运行 应用程序,但不适用于集成测试。
可能需要更多来自服务或域 classes 的代码样本? link 到 github 回购有帮助吗?
问题是由模拟的依赖域对象之间的不正确交互引起的。在我的例子中,UserProfile 属于 User,如果您更改 UserProfile 但随后从 User 检索它 - 您会得到一个惊喜(验证将不起作用)。
一些信息可以在这里找到:
我是 unit/integration/functional 测试的新手。我在 Grails 3.1.7 中使用 Spock 进行集成测试并遇到问题:
我有一个针对我的域的自定义验证器 classes,它既适用于启动的应用程序,也适用于 grails 控制台,但在测试期间无效 运行。
我有 2 个类似的验证器用于 2 个域 classes,其中一个通过,另一个 - 没有。
此验证的主要思想是用户可能有 2 个电子邮件。一个用于登录,另一个用于在个人资料中显示。用户不能选择其他用户的电子邮件地址显示在个人资料中(反之亦然)。
通过相应测试的(应用于用户域class中的电子邮件):
validator: {email, user ->
UserProfile userProfile = UserProfile.findByProfileEmail(email)
if (!userProfile) {
true
} else if (userProfile?.user == user) {
true
} else {
false
}
}
另一个是相同的,但检查了用户的个人资料电子邮件(应用于 UserProfile 域 class 中的个人资料电子邮件):
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
}
我的自定义验证器以某种方式适用于控制台和 运行 应用程序,但不适用于集成测试。
可能需要更多来自服务或域 classes 的代码样本? link 到 github 回购有帮助吗?
问题是由模拟的依赖域对象之间的不正确交互引起的。在我的例子中,UserProfile 属于 User,如果您更改 UserProfile 但随后从 User 检索它 - 您会得到一个惊喜(验证将不起作用)。
一些信息可以在这里找到: