#testing #grails #unique
#тестирование #grails #уникальный
Вопрос:
Я пытаюсь создать тест в grails, чтобы действительно убедиться, что ограничение unique: true работает, вот мой класс и тестовый файл:
пакет edu.drexel.goodwin.events.domain
класс UpayConfig {
String name
String siteId
String postingCode
static constraints = {
name(blank:false, maxSize:50)
siteId(blank:false, unique:true)
postingCode(blank:false)
}
}
пакет edu.drexel.goodwin.events.domain
импортируйте grails.test.*
класс UpayConfigTests расширяет GrailsUnitTestCase { protected void setUp() { super.setUp()}
protected void tearDown() {
super.tearDown()
}
void testCleanUpayConfigValidates() {
mockForConstraintsTests UpayConfig
def cleanUpayConfig = create()
assertTrue cleanUpayConfig.validate()
}
void testUpayConfigSiteIdMustBeUnique() {
mockForConstraintsTests UpayConfig
def upayConfigOne = create()
def upayConfigTwo = create()
assertFalse upayConfigOne.validate()
assertFalse upayConfigTwo.validate()
upayConfigTwo.siteId = '81'
assertTrue upayConfigOne.validate()
assertTrue upayConfigTwo.validate()
}
UpayConfig create() {
def upayConfig = new UpayConfig(
siteId: '82',
name: 'SMT - Workshops',
postingCode: '6'
)
}
}
Но этот второй тест завершается неудачей, обе переменные upayConfig возвращают true для .validate(), хотя я говорю им обоим, что у них один и тот же идентификатор сайта…
У меня такое чувство, что это как-то связано с тем фактом, что они не помещаются в базу данных, а просто хранятся в памяти?
Любая помощь очень ценится, спасибо. -Asaf
Ответ №1:
Уникальность будет на уровне базы данных. Вы никогда не сохраняете домен, поэтому, что касается upayConfigTwo, он уникален. Вам нужно будет выполнить обычный макет и фактически вызвать save() на upayConfigOne.
Ответ №2:
Спасибо. Я просмотрел этот веб-сайт: http://www.ibm.com/developerworks/java/library/j-grails10209/index.html и в нем был раздел под названием «Тестирование уникального ограничения с помощью mockForConstraintsTests()», поэтому, следуя ему, я изменил свой тест следующим образом, и он прошел правильно:
void testUpayConfigSiteIdMustBeUnique() {
def upayConfigOne = create()
mockForConstraintsTests(UpayConfig, [upayConfigOne])
def upayConfigTwo = create()
assertFalse upayConfigTwo.validate()
assertEquals "unique", upayConfigTwo.errors["siteId"]
upayConfigTwo.siteId = '81'
assertTrue upayConfigTwo.validate()
}
Спасибо за вашу помощь,
-Asaf