Как получить сбой метода .save () объекта домена в интеграционном тесте? - PullRequest
4 голосов
/ 24 мая 2011

Для интеграционного теста мне нужно намеренно иметь .save(), чтобы протестировать соответствующее else -обусловление.

Мой тестируемый класс делает это:

Из UserService.groovy:

User user = User.findByXyz(xyz) 
if (user) {
    // foo
    if (user.save()) {
        // bar
    } else {
        // I WANT TO GET HERE
    }
}

Подходы, которые я до сих пор пробовал, потерпели неудачу:

То, что я пробовал в UserServiceTests.groovy:

def uControl    = mockFor(User)
uControl.demand.save { flush -> null }  // in order to test a failing user.save()
def enabledUser = userService.enableUser(u.confirmationToken)
uControl.verify()

// or the following:
User.metaClass.'static'.save = { flush -> null }  // fails *all* other tests too

Как правильно перейти к блоку else из интеграционного теста?

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

У вас почти никогда не должно быть необходимости высмеивать или изменять метакласс в интеграционных тестах - только юнит-тесты.

Если вы хотите завершить вызов save(), просто передайте данные, которые не проверяются. Например, все поля не равны NULL по умолчанию, поэтому использование def user = new User() должно завершиться неудачей.

0 голосов
/ 04 сентября 2011

Что я делаю в таких случаях: У меня всегда есть хотя бы одно поле, которое не является нулевым. Я просто не устанавливаю это и затем вызываю .save () Если вы хотите добиться этого для объекта, уже находящегося в базе данных, просто загрузите его, используя find или get, и установите одно из ненулевых значений в null, а затем попытайтесь сохранить его. Если у вас нет Config.groovy, настроенного на выдачу исключений при сбоях, при сохранении оно не сгенерирует исключение, оно просто не сохранит его [вы можете вызвать .validate () заранее, чтобы определить, будет ли оно сохранено, и проверить список object_instance.errors.allErrors для просмотра ошибок].

0 голосов
/ 24 мая 2011

возможно, вы могли бы попробовать изменить 'validate' на что-то другое - используя то же самое программирование метакласса, которое вы показали.Таким образом, если проверка не удалась, сохранение, безусловно, завершится неудачей

...