/ Клас на тест PlaySpec не е взет, ако се използва инжектиране - scala, инжектиране на зависимост, playframework, scalatest

Класът на теста PlaySpec не се повдига, ако се използва инжекция - скала, зависимост от инжекция, игрална рамка, скалатест

В приложението ми 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]

И от официални документи:

Ако всички или повечето тестове във вашия тестов клас се нуждаят от приложение, и всички те могат да споделят едно и също копие на Application, смесете в GuitsOneAppPerSuite черта с характеристиката GuiceFakeApplicationFactory. Можете да получите достъп до приложението от полето на приложението.

Има и забележителност Injecting тук:

https://www.playframework.com/documentation/2.6.x/Highlights26#Injecting