Play 1.2.2 - теги внутри тегов больше не разрешены? - PullRequest
1 голос
/ 10 августа 2011

Я разрабатываю приложение в игре, и в своих тестах на селен я использую несколько тегов для повторяющихся задач.Два тега:

app / views / tags / loginAs.html

*{ Tag for running selenium tests when being logged in }*

#{if !_keepData}
#{braindumpFixture delete:'all', load:'users.yml' /}
#{/if}

#{selenium}
 ... some selenium code to log into the application
#{/selenium}

app / views / tags / braindumpFixture.html

%{
if(_delete == 'all') {
play.test.Fixtures.deleteAll()
} else if(_delete) {
play.test.Fixtures.delete(_delete)
}
}%

%{
if(_load) {
play.test.Fixtures.load(_load)
}
// finally make sure the index is correctly updated.
new application.jobs.CompleteReindexJob().doJob();
}%

Они работают без проблем в Play 1.1.После перехода на игру 1.2.2 я получаю следующее исключение при запуске теста на селен, который использует loginAs:

test / selenium / AddCard.test.html

*{ Tests adding a simple card }*

#{loginAs login:'foobar@foobar.com', password:'foobar' /}

#{selenium}
open('@{Application.index()}')
... more selenium stuff here
#{/selenium}

Исключением является

play.exceptions.TemplateExecutionException: Cannot get property 'data' on null object
    at play.templates.BaseTemplate.throwException(BaseTemplate.java:84)
    at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:252)
    at play.templates.GroovyTemplate$ExecutableTemplate.invokeTag(GroovyTemplate.java:374)
    at /test/selenium/AddCard.test.html.(line:3)
    at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:229)
    at play.templates.Template.render(Template.java:26)
    at play.templates.GroovyTemplate.render(GroovyTemplate.java:184)
    at controllers.TestRunner.run(TestRunner.java:107)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:543)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:499)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:475)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:470)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:158)
    at Invocation.HTTP Request(Play!)
Caused by: java.lang.NullPointerException: Cannot get property 'data' on null object
    at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:229)
    ... 12 more

Когда я удаляю # {if! _KeepData} вокруг вызова braindumpFixture, я получаю исключение EmptyStackException:

play.exceptions.TemplateExecutionException
    at play.templates.BaseTemplate.throwException(BaseTemplate.java:84)
    at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:252)
    at play.templates.Template.render(Template.java:26)
    at play.templates.GroovyTemplate.render(GroovyTemplate.java:184)
    at controllers.TestRunner.run(TestRunner.java:107)
    at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:543)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:499)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:475)
    at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:470)
    at play.mvc.ActionInvoker.invoke(ActionInvoker.java:158)
    at Invocation.HTTP Request(Play!)
Caused by: java.util.EmptyStackException
    at java.util.Stack.peek(Stack.java:85)
    at java.util.Stack.pop(Stack.java:67)
    at play.templates.TagContext.exitTag(TagContext.java:31)
    at play.templates.GroovyTemplate$ExecutableTemplate.invokeTag(GroovyTemplate.java:380)
    at /test/selenium/AddCard.test.html.(line:3)
    at play.templates.GroovyTemplate.internalRender(GroovyTemplate.java:229)
    ... 9 more

Интересно, что-то кардинально изменилосьс тегами в Play 1.2, и я просто упустил это из виду в документации, или это может быть ошибкой.Любые идеи по решению этой загадки приветствуются.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2012

Проблема в теге # {fixture}. Это убьет внутренний стек при загрузке файла yml. Смотри https://play.lighthouseapp.com/projects/57987-play-framework/tickets/1026-using-tags-inside-tags-is-broken-since-play-121#ticket-1026-3.

В качестве обходного пути вы можете создать модифицированную версию тега фикстуры:

%{
    if(_delete == 'all') {
        play.test.Fixtures.deleteAll()
    } else if(_delete) {
        play.test.Fixtures.delete(_delete)
    }
}%

%{
    if(_load) {
        // Workaround (save the stack)
        stack = play.templates.TagContext.currentStack.get();

        play.test.Fixtures.load(_load)

        // Workaround (restore the stack)
        play.templates.TagContext.currentStack.set(stack);
    }
}%

%{
    if(_arg && _arg instanceof String) {
        try {
            play.Play.classloader.loadClass(_arg).newInstance()
        } catch(Exception e) {
            throw new play.exceptions.TagInternalException('Cannot apply ' + _arg + ' fixture because of ' + e.getClass().getName() + ', ' + e.getMessage())
        }
    }
%}
1 голос
/ 10 августа 2011

Я не знаю, что что-то должно было измениться, чтобы это перестало работать, поэтому можно ожидать, что это ошибка.

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