Требуется помощь в модульном тестировании Grails - PullRequest
3 голосов
/ 09 октября 2009

Я хочу протестировать контроллер Grails, который вызывает сервис. Я хотел бы издеваться над сервисом. Сервис имеет метод:

JobIF JobServiceIF.getJob(int)

и JobIF имеет метод:

String JobIF.getTitle()

Вот мой контроллер

def workActivities = {
   JobIF job = jobService.getJob(params.id)
   [career:job]
}

Я понимаю, что мне нужно смоделировать сервис и класс заданий (есть конкретные реализации для обоих), но я изо всех сил пытаюсь разобраться с синтаксисом насмешливого объекта Groovy. Как мне сменить работу и присвоить ей название, сказать «Архитектор», а затем проверить код?

Пока у меня есть:

void testWorkActivities() {
   def controller = new CareersController()
   ... // Mocking stuff I don't know how to do
   controller.params.id = 12
   def model = controller.workActivities()
   assertEquals "Architect", model["career"].getTitle()
}

1 Ответ

6 голосов
/ 09 октября 2009

У вас есть два варианта

  1. Используйте Groovy классы насмешек, то есть MockFor и StubFor
  2. Используйте фиктивные классы Grails, вызвав метод mockFor для GrailsUnitTestCase. Класс, возвращаемый этим методом, является экземпляром GrailsMock

Лично я обнаружил, что фиктивные объекты Groovy более надежны, чем макеты Граилса. Иногда я обнаруживал, что мои фиктивные объекты Grails обходились, хотя я, казалось, все правильно настраивал.

Вот пример использования макетов Groovy:

void testCreateSuccess() {

    def controller = new CareersController()

    // Create a mock for the JobService implementation class
    def mockJobServiceFactory = new MockFor(JobService)

    mockJobServiceFactory.demand.getJob {def id ->
        // Return the instance of JobIF that is used when the mock is invoked
        return new Job(title: "architect")
    }

    // Set the controller to use the mock service
    controller.jobService = mockJobServiceFactory.proxyInstance()

    // Do the test
    controller.params.id = 12
    def model = controller.workActivities()
    assertEquals "Architect", model["career"].getTitle()
}

Процесс в основном такой же, когда используется макеты Grails, но вы вызываете метод mockFor тестового класса вместо создания экземпляра MockFor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...