Grails项目

时间:2016-08-14 19:20:40

标签: validation grails groovy integration-testing spock

我是单位/整合/功能测试的新手。我在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会有帮助吗?

1 个答案:

答案 0 :(得分:0)

问题是由模拟的依赖域对象之间的不正确交互引起的。在我的情况下,UserProfile属于User,如果您更改UserProfile但从用户检索它 - 您将得到一个惊喜(验证将无效)。

有些信息可以在这里找到:Unit test grails with domain objects using GORM functions