/ / Тест-клас PlaySpec не підібраний, якщо використовується ін'єкція - шкала, залежність-ін'єкція, плей-рамка, масштабований

Клас тесту PlaySpec не підібраний, якщо використовується injection - scala, injection-injection, playframework, scalatest

У моєму додатку 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 для відповіді № 1

Play 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