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 检索它 - 您会得到一个惊喜(验证将不起作用)。

一些信息可以在这里找到: