我正在从 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/