есть метод игрового контроллера
def insertDepartment = Action(parse.json) { request =>
MyDataSourceProvider.db.withSession{ implicit session =>
val departmentRow = DepartmentRow(1, Option("Department1"))
departmentService.insert(departmentRow)
}
}
примечание MyDataSourceProvider.db
обеспечивает slick.driver.PostgresDriver.simple.Database
, а создание withSession
обеспечивает implicit
от session
до departmentService.insert
когда я тестирую, departmentService
session
предоставляется текстовым приспособлением, как указано в этом сообщении а>. sessionWrapper
— это простая функция, которая создает session
, предоставляет этот session
тестовому блоку и откатывает данные после завершения теста.
sessionWrapper { implicit session =>
val departmentRow = DepartmentRow(1, Option("Department1"))
departmentService.insert(departmentRow)
}
Это хорошо работает и, как и ожидалось, не загрязняет базу данных при запуске service
тестов. тесты не должны ничего сохранять в БД, но откат после успешного выполнения.
теперь при тестировании play
controller
нужен способ использовать sessionWrapper
. чтобы иметь возможность откатывать тесты контроллера аналогично service
тестам.
примечание MyDataSourceProvider.db.withSession
в controller insertDepartment
.
обертывание controller
теста с sessionWrapper
не имеет значения, так как контроллер def
не принимает никаких implicit session
, но использует один из MyDataSourceProvider.db.withSession
какой лучший способ справиться с этим? попытался создать контроллер trait
, чтобы иметь возможность inject
внедрять trait
, поэтому миксин может отличаться для теста и реального кода, но не нашел способа «пройти» session
для теста и нет для производственный код. Любые идеи?