Невозможно использовать grailsApplication.getMetadata.get () при выполнении модульного теста для контроллера в grails

В моем приложении grails, в контроллере, я использую следующие вещи:

class SampleController {
   def action1 = {
     def abc = grailsApplication.getMetadata().get("xyz")
     render abc.toString()
   }
}

При запуске приложение правильно считывает свойство «xyz» из application.properties и работает нормально. Но когда я пишу пример модульного теста для вышеуказанного контроллера, как показано ниже:

class SampleControllerTests extends ControllerUnitTestCase {
  SampleController controller

  protected void setUp() {
    super.setUp()
    controller = new SampleController()
    mockController(SampleController)
    mockLogging(SampleController)
  }

  void testAction1() {
    controller.action1()
    assertEquals "abc", controller.response.contentAsString
  }
}

Но когда я выполняю «grails test-app», я ожидаю, что оно возьмет свойство «xyz» из application.properties и вернется, как ожидалось. Но выдает ошибку «Нет такого свойства: grailsApplication».

Я понимаю, я думаю, мне нужно издеваться над объектом grailsApplication, и я также пробовал многие варианты, но все они не сработали.

Я новичок в Grails.


person user2186466    schedule 19.03.2013    source источник
comment
Ведьмовскую версию Грааля вы используете?   -  person    schedule 19.03.2013
comment
версия: grails 1.3.7   -  person user2186466    schedule 19.03.2013
comment
Возможно, вы захотите вместо этого ввести значение abc в свой контроллер, что освободит ваш контроллер от явной зависимости от grailsApplication.   -  person Todd Murray    schedule 19.03.2013


Ответы (1)


mockController не будет издеваться над GrailsApplication, вам нужно будет сделать это самому.

Самым быстрым решением будет что-то вроде:

protected void setUp() {
        super.setUp()
        mockLogging(DummyController)
        GrailsApplication grailsApplication = new DefaultGrailsApplication()
        controller.metaClass.getGrailsApplication = { -> grailsApplication }
    }

Это решение не идеально - оно будет создавать новый DefaultGrailsApplication во время каждой настройки, а mockController также создает несколько дополнительных экземпляров DefaultGrailsApplication.

Обратите внимание, что вам не нужно звонить mockController самостоятельно, это сделает ControllerUnitTestCase за вас.

person Dror Bereznitsky    schedule 19.03.2013
comment
Спасибо, drorb. Я опробовал предоставленное вами решение и работает в точности так, как ожидалось. Большое спасибо!!!!!!!!! :) - person user2186466; 20.03.2013
comment
Рад слышать, что помогло :-). Если можете, отметьте этот вопрос как ответ - спасибо - person Dror Bereznitsky; 20.03.2013