Динамические методы Grails отсутствуют при выполнении интеграционных тестов - PullRequest
0 голосов
/ 25 сентября 2018

Я работаю над проектом с использованием Grails 2.5.4 и в настоящее время пытаюсь запустить некоторые интеграционные тесты, которые не выполняются.Я отладил проблему и обнаружил, что, по-видимому, некоторые динамические методы в тестируемых сервисах отсутствуют при запуске интеграционного теста (если вы запускаете его в контексте приложения, методы есть, и все работает).Это происходит во многих тестах, которые я пытаюсь запустить, я выбрал один в качестве примера, но у других, которые терпят неудачу, возникают те же проблемы.

У меня есть этот класс домена

class Event {
...
    static hasMany = [
        bundles : Bundle
    ]
...    
}

и метод обслуживания, который нужно протестировать:

@Transactional
class BundleService {
...
    void assignEvent(Event event, List bundleIds) {
    ..
        for (id in bundleIds) {
            event.addToBundles(Bundle.get(id))
        }
    }
...
}

Итак, я запускаю этот тест на спок

class BundleServiceIntegrationSpec extends Specification {

    BundleService bundleService
    EventService  eventService
    private BundleTestHelper bundleHelper = new BundleTestHelper()

    ...

    void '04. Test deleteBundleAndAssets method'() {
    when: 'a new Bundle is created'
        Bundle bundle = bundleHelper.createBundle(project, 'Test Bundle')
    and: 'a new Event is created'
        Event event = eventService.create(project, 'Test Event')
    and: 'the above Bundle is assigned to the Event'
        bundleService.assignEvent(event, [bundle.id])
    ...
}

, он не проходит в строке moveEvent.addToBundles (Bundle.get (id)) из BundleService со следующим исключением

groovy.lang.MissingMethodException: No signature of method: 
net.domain.Event.addToBundles() is applicable for argument 
types: (net.domain.Bundle) values: [Test Bundle]
Possible solutions: getBundles()
at net.service.BundleService.$tt__assignEvent(BundleService.groovy:101)

Проблема заключается в том, что метод addToBundles (), который должен динамически добавляться Grails в класс Event из-за коллекции hasMany ", связывает"не добавлено.Как я уже говорил, если вы запускаете приложение и используете этот сервис, метод есть, и все работает.

Я попытался изменить базовый класс теста (со Спецификации на IntegrationSpec), так как я верю, что именно здесь динамическийВозможности, а также управление транзакциями и другие вещи для интеграционных тестов управляются, но это не сработало.

Есть ли причина, по которой этот метод, который должен присутствовать в сервисе, отсутствует в контексте интеграционных тестов?Спасибо

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

@ Szymon Stepniak Спасибо за ваш ответ и извините за поздний ответ.Я проверил то, что вы предложили, но это не сработало.Позже я прочитал, что аннотация grails.test.mixin.Mock предназначена только для модульных тестов и не должна использоваться в интеграционных тестах.Это также верно для аннотаций @TestFor и @TestMixin (об этом я читал в этой публикации ).
Так что после этого коллега по работе предложил мне искать такого родааннотаций в других тестах, думая, что, возможно, это может привести к некоторому загрязнению теста между тестами, и после удаления аннотации @TestFor в одном из тестов, которые ранее выполнялись как часть всего комплекта интеграционных тестов, - провальный тест, который яопубликовал начал работать.Самым странным (приложение от компилятора, не жалующегося на это) является то, что тест, который нарушил работу (тот, из которого я удалил аннотацию @TestFor), прошел все зеленые, он даже не провалился!
Так что, если у кого-то естьаналогичную проблему я предлагаю искать в подобных аннотациях модульных тестов в любом месте всего комплекта интеграционных тестов и удалять их, потому что компилятор не будет жаловаться, но по моему опыту это может повлиять на другие тесты и может привести к очень странным последствиям.поведение.

0 голосов
/ 25 сентября 2018

Вам не хватает аннотации grails.test.mixin.Mock в вашем тестовом классе.В модульном тесте Grails этот миксин используется для генерации всех связанных с доменом методов для класса, чтобы вы могли правильно использовать этот домен в модульном тесте.Что-то вроде этого должно помочь:

@Mock([Event])
class BundleServiceIntegrationSpec extends Specification {

    BundleService bundleService
    EventService  eventService
    private BundleTestHelper bundleHelper = new BundleTestHelper()

    ...

    void '04. Test deleteBundleAndAssets method'() {
    when: 'a new Bundle is created'
        Bundle bundle = bundleHelper.createBundle(project, 'Test Bundle')
    and: 'a new Event is created'
        Event event = eventService.create(project, 'Test Event')
    and: 'the above Bundle is assigned to the Event'
        bundleService.assignEvent(event, [bundle.id])
    ...
}

Подробнее о тестировании классов доменов можно узнать здесь: https://grails.github.io/grails2-doc/2.4.5/guide/testing.html#unitTestingDomains

...