В приложението ми 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]
И от официални документи:
Ако всички или повечето тестове във вашия тестов клас се нуждаят от приложение, и всички те могат да споделят едно и също копие на Application, смесете в GuitsOneAppPerSuite черта с характеристиката GuiceFakeApplicationFactory. Можете да получите достъп до приложението от полето на приложението.
Има и забележителност Injecting
тук:
https://www.playframework.com/documentation/2.6.x/Highlights26#Injecting