Тестирование игровых модулей и FakeApplication

Я хотел бы знать, как лучше всего запускать тесты spec2 в модуле PlayFramework и иметь возможность имитировать его работу.

Мой модуль содержит несколько маршрутов в файле с именем mymodule.routes. В своих приложениях я интегрирую их, добавляя следующую строку в файл маршрутов.

->  /mymodule mymodule.Routes

Это тест из моего модуля, который я пытаюсь запустить, но возвращает ошибку 404:

"test myroute" in {
  running(FakeApplication()) {
    await(WS.url("http://localhost:9000/mymodule/myroute").get).status must equalTo(OK)
  }
}

person Roch    schedule 16.05.2013    source источник


Ответы (1)


FakeApplication на самом деле не запускает веб-процесс, поэтому вы не можете протестировать использование http-доступа к локальному хосту.

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

  • Тестирование контроллера напрямую
  • Тестирование маршрутизатора
  • Тестирование всего приложения.

Тестирование контроллера выполняется путем прямого вызова вашего контроллера и проверки результата, как это предлагается в игровой документации, и предоставления FakeRequest().

val result = controllers.Application.index("Bob")(FakeRequest())

Тестирование роутера выполняется вызовом routeAndCall с аргументом FakeRequest, указав относительный путь:

val Some(result) = routeAndCall(FakeRequest(GET, "/Bob"))

В конце концов, если вы хотите протестировать все свое приложение, вам нужно запустить TestServer:

"run in a server" in {
  running(TestServer(3333)) {

    await(WS.url("http://localhost:3333").get).status must equalTo(OK)

  }
}

Ваш вопрос говорит: «Какой лучший вариант?». Ответ таков: нет ничего лучше, есть разные способы тестирования для разных целей. Вы должны выбрать стратегию тестирования, которая лучше соответствует вашим требованиям. В этом случае, поскольку вы хотите протестировать маршрутизатор, я предлагаю вам попробовать подход № 2.

person Edmondo1984    schedule 16.05.2013
comment
спасибо, это имеет смысл, однако я не знаю, что делать с маршрутами, потому что они возвращают 404, если они не реализованы родительским приложением. Я попытался добавить базовый файл маршрута в модуль только для теста, но он не работает, если я не удалю mymodule.routes. - person Roch; 16.05.2013
comment
Вы не можете проверить URL-адрес, если не запустите TestServer. Прочитайте еще раз мой ответ - person Edmondo1984; 16.05.2013