Вызов метода контроллера внутри другого в функциональном тесте ведет себя странно

Кажется, что когда общедоступный статический метод контроллера явно вызывает другой общедоступный статический метод того же контроллера (с вызовом Java), Play! не знает, нужно ли просто выполнить код или перенаправить в функциональном тесты.

Если бы у меня был:

public class ApplicationTest extends FunctionalTest {
    @Test
    public void testProvesThatFunctionalTestsDoesntCallControllerMethods() {
        Response response = GET("/");

        assertEquals("", getContent(response));
    }

    @Test
    public void testProvesThatCallingItDirectlyWorksAsExpected() throws Exception {
        Response response = GET("/another");

        assertEquals("ok!", getContent(response));

    }

}

И:

public class Application extends Controller {
    public static void index() {
        another();
    }

    public static void another() {
        renderText("ok!");
    }
}

Но если я запускаю play run или play start и вызываю "/" в своем веб-браузере, он возвращает "ok!", не следует FunctionalTest Работать точно так же, как на продакшене или как на реальном сервере? Это заставляет меня избегать функционального тестирования или иметь огромную ручную настройку и зависимость от предварительно запущенного веб-сервера, что не круто.

Заранее спасибо.


person Jayr Motta    schedule 10.10.2012    source источник


Ответы (1)


В вашем браузере, когда вы вызываете "/", он возвращает "ok", но не при первом ответе. Сначала он возвращает перенаправление (302), а затем возвращает 200 (хорошо).

В вашем функциональном тесте это то же самое, вам нужно сделать что-то вроде

Response response = GET("/");
assertStatus(302, response);
response = GET(response.headers.get("Location").value())
assertIsOk(response);
assertEquals("ok!", getContent(response));
person Seb Cesbron    schedule 11.10.2012
comment
Вы правы, но мне интересно, насколько это хорошо. В моем проекте у меня есть метод, который вызывает другой метод контроллера, и этот метод вызывает первый метод в косвенной рекурсии, затем он возвращается два раза и перенаправляется на следующий. Хотя это звучит как желаемое поведение, Play! пользователи должны это четко понимать, чтобы мы могли избежать всей этой работы с http в пользу вызовов Java. - person Jayr Motta; 11.10.2012
comment
если вы хотите сделать прямой вызов Java вместо перенаправления, вызовите другой общий метод с аннотацией @Util или общий частный метод - person Seb Cesbron; 11.10.2012