簡體   English   中英

單元測試中的Grails Unique Id約束沒有失敗

[英]Grails Unique Id constraint in Unit test not failing

我正在從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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM