Воспроизведение модулей тестирования и FakeApplication
Я хотел бы знать, каков наилучший способ запуска тестов specs2 на модуле 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)
}
}
1 ответ
FakeApplication на самом деле не запускает веб-процесс, поэтому вы не можете тестировать, используя http-доступ к localhost.
У вас есть три варианта:
- Тестирование контроллера напрямую
- Тестирование роутера
- Тестирование всего приложения.
Тестирование контроллера выполняется путем непосредственного вызова вашего контроллера и проверки результата, как предлагается в документации к игре, и предоставления 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