Как проверить, что контроллеры правильно записывают в БД в режиме playframework - PullRequest
1 голос
/ 17 января 2012

У меня есть FunctionalTest, который тестирует отправку в контроллер, а затем проверяет объекты модели, чтобы убедиться, что контроллер выполнил свою работу, например:

@Test
public void editUser(){
    Logger.debug("Edit user test");
    createNewUser();
    final User user = User.<User>findAll().get(0);
    POST("/ManageUser/save", ImmutableMap.of(
            "user.id", user.getId().toString(),
            "user.username", "test",
            "user.email", "test@example.com",
            "user.fullName", "Test Different"
    ));
    User.em().flush(); 
    User.em().clear(); // this is required so that it works on the mem DB
    assertEquals(1, User.findAll().size());
    assertEquals("Test Different", User.<User>findAll().get(0).fullName);
    final User userAfterSave = User.<User>findAll().get(0);
    assertFalse("New user should not be admin.", userAfterSave.isAdmin);
}

Это проходит при использовании базы данных mem

%test.db.url=jdbc:h2:mem:play;MODE=MYSQL;LOCK_MODE=0

Тем не менее, если я переключаюсь на mysql

%test.db=mysql://test:test@localhost/test

Это не сработает при втором утверждении "Сбой, ожидаемый: <Test [Differen]t>, но был: <Test [Tes]t>".Таким образом, при использовании mysql контроллер не сохраняет пользователя должным образом.

Что мне здесь не хватает, есть ли какие-то параметры управления транзакциями, которые мне нужно изменить, чтобы это работало?

контроллер просто вызывает user.merge (). save () для обновления пользователя, это как-то не так?

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Это потому, что база данных mem не является должным образом транзакционной, то есть тестовый поток получает новые данные при каждом чтении.Однако для mysql тестовый поток читает пользователя в createNewUser (), что означает, что его транзакция имела предыдущую версию.Это не очевидно, но POST () запускает новый поток с отдельной транзакцией.Чтобы решить этот обмен

User.em().flush(); 
User.em().clear();

на

JPAPlugin.closeTx(false);
JPAPlugin.startTx(false);

Позднее начинается новая транзакция.

1 голос
/ 17 января 2012

Выполните поиск в отдельной работе, чтобы убедиться, что она правильно просматривает изменения (изоляция транзакции). Вот пример

private FeedbackType findFeedbackType(final String name) throws ExecutionException, InterruptedException {
    return new Job<FeedbackType>() {
        @Override
        public FeedbackType doJobWithResult() throws Exception {
            return FeedbackType.findByName(name);
        }
    }.now().get();
}

Это частный метод моего Функционального теста, и я вызываю этот метод для получения моего объекта вместо прямого вызова модели

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