2015-08-16 1 views
0

В настоящее время пытается проверить Grails служба (Опыт работы с Геба функционального тестирования)Grails блок тестирования услуга Спока насмешливый функциональность

Пытаюсь издеваться необходимых требуемых данных, что услуга будет необходимо (например, пользователя и т. д.) ... независимо от того, как я, кажется, объявляю/инициализирую интересующие вас области, все отображаются как NULL во всех моих методах тестирования

Я пытаюсь установить эту требуемую информацию один раз, чтобы она могла повторно использовать методы испытаний.

@TestFor(ReminderService) 
@Mock([Reminder, User, Subscriptions, Organisation, UserOrganisation, OrganisationRole, Ref, Role, Title]) 
class ReminderServiceTests extends Specification { 

@Shared user, org, userOrg, roleUser, sub, orgRole, ti, refVals, reminder 
def mailService 


def setup() { 
    def refSubStatus = new Ref(value: 'Current').save() 
    def refSubPublic = new Ref(value: 'No').save() 
    def refSubType = new Ref(value: 'Subscription Taken').save() 
    def refRemUnit = new Ref(value: 'Month').save() 
    def refOrgRole = new Ref(value: 'Subscriber').save() 
    def refRemMethod = new Ref(value: 'email').save() 
    def refRemTrigger = new Ref(value: 'Subscription Manual Renewal Date').save() 
    reminder   = new Reminder(user: user, active: true, amount: 1, unit:refRemUnit, reminderMethod:refRemMethod, trigger: refRemTrigger, lastRan:null).save() 
    refVals  = [refSubStatus,refSubPublic, refSubType, refRemUnit, refOrgRole, refRemMethod, refRemTrigger] 
    roleUser   = new Role(authority: 'BASIC_USER', roleType:'global').save() 

    ti    = new Title(title: "A random title....", impId: UUID.randomUUID().toString()).save() 
    sub    = new Subscription(name:"A random subscription name", 
             status:refSubStatus, 
             identifier:UUID.randomUUID().toString(), 
             impId:UUID.randomUUID().toString(), 
             startDate:new LocalDate().minusYears(1).toDate(), 
             endDate: new LocalDate().plusMonths(1).toDate(), 
             isPublic: refSubPublic, 
             type: refSubType, 
             renewal: new LocalDate().minusMonths(3).toDate()).save() 
    org    = new Organisation(name: "new org", impId: UUID.randomUUID().toString()).save() 
    orgRole   = new OrganisationRole(sub: sub, roleType: refOrgRole, org: org).save() 
    user    = new User(username: 'j_doe', firstname: "John", lastname: "Doe", email: '[email protected]', defaultDash: org).save() 
    userOrg   = new UserOrganisation(org: org, user: user, formalRole: roleUser, status: 1).save() 
    mailService  = new MailService() 
//  mockDomain(Ref, refdataValues) 
//  mockDomain(Title, ti) 
//  mockDomain(OrganisationRole, orgRole) 
//  mockDomain(Organisation, org) 
//  mockDomain(User, user) 
//  mockDomain(UserOrganisation, userOrg) 
//  mockDomain(Reminder, reminder) 
} 


def "Getting subscriptions for a user"() { 
    when: 
    def subscriptions = service.getAuthorisedSubsciptionsByUser(user) 

    then: 
    subscriptions != null 
    subscriptions.size() > 0 
} 

Все равно нулю, я попытался с помощью mockDomain (см закомментирована раздел в setup(), в том числе с использованием setupSpec() что-то не совсем верно)

ответ

0

Вы пробовали не используя @Shared? Я вижу это сейчас, вам это не нужно. Ваши ссылки распространяются на протяжении всего жизненного цикла Spec, но вы устанавливаете свой код init в настройке, который вызывается перед каждой спецификацией. Это не кажется правильным. Переменные @Shared внутренне хранятся в другом экземпляре, чем обычные переменные, поэтому может произойти какое-то смешение. Кроме того, вы можете попытаться использовать setupSpec() вместо setup() для переменных @Shared.

+0

'компиляция ошибок компиляция [unit] тестов: запуск не удался: из этого могут быть доступны только @Shared и статические поля ... Я смешиваю два разных стиля тестирования, я изменил его на использование' setupSpec() '? Если я оставлю его как 'setup()' без совместного использования, но все равно проблема, как в OP ... Такая запутанная тема, спасибо за помощь – RST

+0

Если вы используете свои значения в setupSpec или в тех местах, где вам придется использовать значения @Shared. Однако я обнаружил, что часто не стоит головной боли, особенно при использовании классов домена в grails. Я просто создаю отдельное приспособление для каждой спецификации и реорганизую код прибора. Это почти так же сухо, хотя и не так эффективно. – loteq

0
@TestFor(SomeService) 
@Mock([DomainClass]) 
class SomeServiceSpec extends Specification { 
    def "test someMethod"() { 
     given: 
      def x = new DomainClass(attr1: 'a', attr2: 'b').save(flush: true) 
     when: 
      def result = service.someMethod() // returns that saved Domain instance 
     then: 
      result instanceof DomainClass 
      result.attr1 == 'a' 
      result.attr2 == 'b' 
    } 
} 

.save() оказался недостаточным в моих модульных тестах, в то время как .save (flush: true) дает желаемые результаты.

 Смежные вопросы

  • Нет связанных вопросов^_^