Сбой уникального теста Grails?

#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