[英]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.