unit-testing - 单元测试中的Grails Unique Id约束没有失败

标签 unit-testing grails grails-orm

我正在从 grails 1.3.6 升级到 2.2.4 并完成我所有的单元测试。我一直在用 @Mock 注释替换 mockDomain。我的一项测试是验证 ID 是否保持唯一,如果 ID 已经存在则失败。这似乎不再像预期的那样失败。测试如下:

import grails.test.*
import grails.test.mixin.TestFor
import grails.test.mixin.Mock
@Mock(SecurityValue)
@TestFor(SecurityValue)
class SecurityValueTests{
    void testUniqueId() {
        def validEntry = new SecurityValue(id:"id",propertyName:"propertyName",userId:"testUser",componentId:1000)
        validEntry.id = "id"
        def saved = validEntry.save(flush:true, failOnError:true)
        assertNotNull saved
        def validEntry2 = new SecurityValue(id:"id",propertyName:"propertyName1",userId:"testUser3")
        validEntry2.id = "id"
        def saved2 = validEntry2.save(flush:true, failOnError:true)
        def all = SecurityValue.findAll()
        assertNull saved
    }
}

域:

class SecurityValue {

String id
String propertyName
String userId
//String userName
Long componentId

static constraints =
{
    id unique:true, size: 1..100
    propertyName nullable: false, size: 1..100
    userId nullable: false, size: 1..10
    componentId (
        nullable: true, size: 1..10
    )
}

static mapping =
{ 
    table 'pac_sys.security_value'
    id column:'id', type: 'string', generator: 'assigned'
    version false;
}
}

我遇到的问题是 validEntry2.save 行没有失败。我添加了 findAll 行以查看存储了哪些数据,看起来 validEntry 正被 validEntry2 覆盖。

我是不是漏掉了模拟语句或其他东西?


这是应用 jonnybot 的答案后测试的样子。它现在有一个 shouldFail 方法而不是 assertNull 并且可以正常工作。

void testUniqueId() {
    def validEntry = new SecurityValue(id:"id",propertyName:"propertyName",userId:"testUser",componentId:1000)
    validEntry.id = "id"
    mockForConstraintsTests(SecurityValue, [validEntry])
    def validEntry2 = new SecurityValue(id:"id",propertyName:"propertyName1",userId:"testUser3")
    validEntry2.id = "id"
    shouldFail(grails.validation.ValidationException)
    {
        def saved2 = validEntry2.save(flush:true, failOnError:true)
    }
}

最佳答案

由于您真正想做的是测试约束,因此请在测试中使用 mockForConstraintsTests() 和 validate() 方法。请参阅 http://grails.org/doc/2.2.4/guide/testing.html#unitTestingDomains 下的“测试约束” .

例如,您可能有

void testUniqueId() {
    def validEntry = new SecurityValue(id:"id",propertyName:"propertyName",userId:"testUser",componentId:1000)
    validEntry.id = "id"
    def saved = validEntry.save(flush:true, failOnError:true)
    assertNotNull saved
    mockForConstraintsTests(SecurityValue, [validEntry])

    def invalidEntry = new SecurityValue(id:"id",propertyName:"propertyName1",userId:"testUser3")
    invalidEntry.id = "id"
    assert !invalidEntry.validate()
}

关于unit-testing - 单元测试中的Grails Unique Id约束没有失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19989339/

相关文章:

grails - 你什么时候会使用新的动态 GORM 方法 findOrSaveBy/Where?

reactjs - 如何模拟 React setState 进行 API 测试

javascript - 将 sinon 模拟与 nodeunit 一起使用

multithreading - Grails 1.3.7- Multi-Tenancy 插件和多线程操作-线程无法访问租户

hibernate - Grails/GORM/Hibernate:引用未保存的 transient 实例的域实例的属性列表

grails 操作所需的参数检查

python - 为什么对象主键在 Django 中的测试之间递增?

java - Mockito ArgumentCaptor 在验证时不返回任何值

oracle - Grails - hasMany 太多了,需要限制 Oracle 中的 get() 结果

grails - 删除 GORM 中的子 parent 关联