У меня есть метод, который принимает Play Http.Context
и «делает некоторые вещи» с сеансом. Я хочу написать единичный тест только для этого метода. В частности, я хочу проверить, что если запрос приходит с некоторыми заголовками, мой метод работает правильно. Кажется, что самый простой способ сделать это надежно - создать FakeApplication
и Controller
для моего теста. Затем я буду использовать Helpers.fakeRequest
, чтобы получить запрос, и Helpers.route
, чтобы перенаправить этот запрос на мой контроллер. Контроллер будет вызывать мой метод, устанавливать некоторые переменные и т. Д., И тогда я мог бы утверждать успех и тому подобное.Play route/Controller только для модульного теста
Похоже на великолепный план, но я не могу понять, как добавить маршрут к моему контроллеру в FakeApplication
. Обратите внимание, что этот контроллер не является частью моего приложения - это просто то, что я хочу использовать для этого теста. Поэтому я хочу определить его и построить только в одном модульном тесте; Я не хочу добавлять его в файл conf/routes
.
В частности, я хочу что-то вроде этого:
// Maybe I can use GlobalSettings.onRouteRequest but the return type
// is play.api.mvc.Handler which seems inaccessible from Java
FakeApplication app = Helpers.fakeApplication(new MyGlobalSettings());
Http.Request request = Helpers.fakeRequest().withCookies(...).withBody(...);
Controller testContoller = new MyTestController();
// This doesn't exist, but I want something like this
app.addRoute("/foo", ctx -> testController.method(ctx));
running(app,() -> {
Helpers.route("/foo");
assertThat(testContoller.itWorked()).isTrue();
}
Я бегу Play 2.2.3 и писать на Java, а не Scala.
Я понимаю, что могу напрямую построить Http.Context
и передать это моему методу. Однако это не мой предпочтительный подход по нескольким причинам:
- Конструктор
Http.Context
принимает простой текст переменных сеанса. Я хочу проверить, что все работает правильно, когда запрос содержит зашифрованный файл cookie сеанса. - Конструктор
Http.Context
плохо документирован и кажется немного выключенным. Например, вы можете передать конструкторуHttp.Request
, но вы также передаете данные cookie и данные сеанса. Итак, что происходит с данными cookie/сеанса по запросу? Соединяется ли с другими данными? Игнорируется? - Конструктор
Http.Context
сложно использовать из Java, поскольку для него требуетсяplay.api.mvc.RequestHeader
, который не может быть построен на Java, иplay.mvc.Http.Request
, который не может быть «полезен» из Java (вы можете его создать, но без файлов cookie , заголовки и т. д. иFakeRequest
не могут быть преобразованы вHttp.Request
). - Он чувствует себя более «черным ящиком» для отправки запроса и обеспечения того, чтобы все работало, а не пыталось выяснить, как эта конкретная версия Play конвертирует мой запрос в
Http.Context
(например, ручное построение контекста, скорее всего, будет ломаться с новыми версии игры).
Любые идеи?
какая версия игры! ты используешь? – w4tson
Я запускаю Play 2.2.3 и записываю на Java, а не в Scala. –