У моєму додатку Play 2.6.x я тестую PlaySpec
. Тепер я хотів би ввести якийсь об'єкт, який буде використаний у тестовому коді.
class AuthControllerTest @Inject()(userRepository: UserRepository)
extends PlaySpec with GuiceOneAppPerSuite with Injecting {
"Foo bar" should {
"do xyz" in {
// do something with userRepository
}
}
}
Однак цей клас ніколи не приймають до тестів, наприклад при бігу sbt test
.
Простий спосіб вирішити - вручну дістати інжектор з поточного екземпляра Play, але Play.current
є застарілим, і він, як правило, хакі:
class AuthControllerTest
extends PlaySpec with GuiceOneAppPerSuite with Injecting {
"Foo bar" should {
"do xyz" in {
val userRepository = Play.current.injector.instanceOf[UserRepository]
// do something with userRepository
}
}
}
Чому не працює перший приклад? І чи є більш чистий підхід, ніж другий приклад?
Відповіді:
2 для відповіді № 1Play Framework не робить введення залежності для тестів, як перший приклад. На другому вам не потрібно Play.current
з GuiceOneAppPerSuite
робить заявку (app
) доступні вам. Отже, ви можете зробити:
val userRepository = app.injector.instanceOf[UserRepository].
І за допомогою Injecting
ви можете ще більше спростити це:
val userRepository = inject[UserRepository]
І з офіційні документи:
Якщо для всіх або більшості тестів у вашому тестовому класі потрібна програма, і вони можуть спільно використовувати один і той же екземпляр програми, змішайте рису GuiceOneAppPerSuite з ознакою GuiceFakeApplicationFactory. Ви можете отримати доступ до програми з поля додатка.
Також є родзинка про Injecting
тут:
https://www.playframework.com/documentation/2.6.x/Highlights26#Injecting