Validation 从2.2迁移到2.3后,唯一约束验证现在在Grails中通过。刷新模式改变了吗?

Validation 从2.2迁移到2.3后,唯一约束验证现在在Grails中通过。刷新模式改变了吗?,validation,grails,gorm,Validation,Grails,Gorm,我目前正在将一个(更大的)项目从Grails2.2.4迁移到2.3.11。经过一些修改和插件升级,我终于让应用程序运行起来了。但不幸的是,测试失败了(大部分) 大多数测试都失败了,因为约束验证失败,特别是唯一约束验证。我通过创建一个带有一个域类的简单应用程序来验证这一点。相应的测试在2.2.4中通过,但在2.3.11中失败。这是我的域类: class Car { String brand static constraints = { brand unique:

我目前正在将一个(更大的)项目从Grails2.2.4迁移到2.3.11。经过一些修改和插件升级,我终于让应用程序运行起来了。但不幸的是,测试失败了(大部分)

大多数测试都失败了,因为约束验证失败,特别是唯一约束验证。我通过创建一个带有一个域类的简单应用程序来验证这一点。相应的测试在2.2.4中通过,但在2.3.11中失败。这是我的域类:

class Car {
    String brand

    static constraints = {
         brand unique: true
    }
}
下面是一个简单的测试(通过Grails2.2.4):

如果我将测试更改为:

@TestFor(Car)
class CarTests {
    Car car = new Car("VW")
    car.save(flush: true)  // added flushing

    //Car.findAll() instead of flushing a findBy will do it

    car = new Car("VW")
    Assert.assertFalse(car.validate())
}
现在考试通过了

看起来,刷新模式改变了,但我在Grails的发行说明中找不到任何关于它的信息


有没有人经历过同样的问题?有人有解释(和解决方案)吗?我真的很担心这一点,因为这种行为对迁移应用程序的代码库有很大影响。

您使用的是单元测试注释,所以刷新不应该影响单元测试GORM impl中的任何内容。这些是集成测试吗?如果是这样的话,不要用那些注释汉克,伯特。是的,这是一个单元测试。我还用Grails2.4.4尝试了这个测试,结果也是一样的。只有添加“flush:true”或任何findBy方法才能做到这一点。我将此测试移到集成测试部分并删除了注释。然后它在没有刷新或findByXXX的情况下工作。这在Grails2.2中似乎有所不同。因此,我必须移动大部分单元测试并将它们迁移到集成测试中……您如何通过向构造函数传递
字符串
来构造
汽车
实例,是不是应该是
新车(品牌:“VW”)
@TestFor(Car)
class CarTests {
    Car car = new Car("VW")
    car.save(flush: true)  // added flushing

    //Car.findAll() instead of flushing a findBy will do it

    car = new Car("VW")
    Assert.assertFalse(car.validate())
}