2014-10-23 3 views
0

Учитывая, что я новичок в отношении грааля, я пытаюсь проверить заводский класс. Класс Factory находится в папке src, так как я не хочу, чтобы он был сервисом.Grails test a Factory class

class UserFactory { 

static Map userDefaults = [ 
     email   : '[email protected]', 
     alias   : 'myalias', 
     firstName  : 'Antonio', 
     lastName  : 'Roma', 
     password  : 'asdhjs', 
     placeOfBirth : 'Milan', 
     placeOfResidence: 'Berlin', 
     dateOfBirth  : new Date() - 4000 
] 

static User build(Map properties, Map options = [persisted: true]) { 
    userDefaults.putAll properties 
    def user = new User(userDefaults) 

    if (options.persisted) { user.save() } 

    return user 
} 

static Collection<User> build(Collection<Map> properties, Map options = [persisted: true]) { 
    properties.collect { build(it, options) } 
} 

}

Я хочу, чтобы проверить, если пользователи будут созданы и сохранены должным образом через GORM. Здесь интеграционный тест:

@TestMixin(DomainClassUnitTestMixin) 
class UserFactoryIntegrationSpec extends Specification { 

def setup() { 
    mockDomain(User) 
} 

def cleanup() { 
} 

void "create user"() { 
    when: 
    User user = UserFactory.build([alias: 'xx', email: '[email protected]']) 

    then: 
    User.count() == 1 
    user.alias == 'xx' 
    user.email == '[email protected]' 
    user.id != null 
} 

void "create users"() { 
    when: 
    Collection<User> users = UserFactory.build([[alias: 'xx', email: '[email protected]'], [alias: 'yy', email: '[email protected]']]) 

    then: 
    users.size() == 2 
    users.alias == ['xx', 'yy'] 
    users.email == ['[email protected]','[email protected]'] 
    users.id != [null, null] 
} 

}

Пользователям не хранятся, я думаю GORM не загружен правильно ... мне не хватает некоторых аннотаций ?! здесь результаты интеграции тест-приложений: UserFactoryIntegrationSpec

User.count() == 1 
    |  | 
    0  false 

users.id != [null, null] 
|  | | 
|  | false 
|  [null, null] 
[rigel.resources.User : (unsaved), rigel.resources.User : (unsaved)] 
+0

Установка вариантов сборки в статическую карту - это путь к гибели. вы будете уничтожать карту по частям (с каждым вызовом), и у вас есть состояние гонки! – cfrick

+0

проверить результат вашего вызова 'save()' и если он является ложным, вам нужно посмотреть 'user.errors'. Или вы можете передать 'failOnErrors: true' свой вызов сохранения или' validate() 'пользователь заранее. – cfrick

+0

спасибо @cfrick! Я не заметил ... Я исправил это! – Antonio

ответ

2

Вы начали на такой высокой ноте:

Я хочу, чтобы проверить, если пользователи будут созданы и сохранены должным образом через GORM. Здесь был проведен интеграционный тест:

, но затем все это произошло, потому что вы используете единичный тест, претендующий на интеграционный тест, и, что еще хуже, вы проверяете устойчивость на модульных тестах.

Выполняйте интеграционные тесты для проверки настойчивости. Используйте только класс домена, издевательский, когда единичный тест имеет смысл для того, что вы тестируете, и вы хотите, чтобы уровень уровня домена отвечал определенным образом, чтобы вы могли сосредоточиться на контроллере/службе/и т. Д. это проверяется.

Используйте интеграционные тесты, которые конфигурируют с минимальной базой данных H2 с полной поддержкой ACID, блокировкой строк, реальными SQL-запросами и т. Д. И если вы предпочитаете, вы можете отключить его для тестовой схемы Oracle, базы данных MySQL, независимо от того, , Но ваши тесты выполняют реальные запросы и обновления. Если вы используете mocks для проверки настойчивости, вы действительно просто проверяете макетов.

Интеграционные тесты не используют mixins, mocks и т. Д. Существует настоящий Spring ApplicationContext, Hibernate (или любой другой GORM, который вы используете), загружаются плагины и т. Д. Используйте JUnit 3 (расширение GroovyTestCase) или JUnit 4 (без базового класса, используя аннотации JUnit) или Spock. Обратите внимание, что тесты интеграции настраивают каждый тестовый прогон на транзакцию, и это откат в конце успешного теста или ранее, если тест завершился неудачно, но в любом случае переключение между тестами не происходит.

Если вы хотите использовать Spock (и вы должны), то расширяйте grails.test.spock.IntegrationSpec для более новых версий Grails, которые по умолчанию используются для тестов Spock. В более старых версиях установите плагин spock и используйте базовый класс интеграции плагина.

+0

Я понял! Спасибо большое!! – Antonio