2016-12-05 7 views
2

Я пошевелил модульные тесты из:Scala играть 2,5 тест не работает, так как я использовал инъекцию depencency

class UserSpec extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions 
{ 

To:

class UserSpec @Inject() (implicit exec: ExecutionContext, db: DBConnectionPool) 
    extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions 
{ 

Все было нормально с первой версией, но теперь, когда Я запускаю тесты, я получаю следующий результат:

[info] No tests were executed. 
[success] Total time: 4 s, completed Dec 5, 2016 8:35:24 PM 

Обратите внимание, что я не хочу, чтобы мои тесты выполнялись с одинаковыми зависимость, вводимая как в ходе тестов, так и в производстве. Благодаря !

EDIT

Code available on github

+0

Вы можете указать код? это трудно догадаться. совместно использовать структуру проекта – pedrorijo91

+0

Возможный дубликат [Specs2: как протестировать класс с более чем одной инъекционной зависимостью?] (http://stackoverflow.com/questions/34159857/specs2-how-to-test-a-class- с более чем одной инъецируемой зависимостью) – rethab

+0

OneAppPerTest, AsyncAssertions и BeforeAndAfter являются связанными с масштабированием свойствами. Это не вопрос specs2. – alextsc

ответ

3

Вы не можете использовать инъекции конструктора при написании тестов Play с scalatest. Вместо этого у вас есть доступ к инжектору прямо в поле app.injector при смешивании в черту сервера или приложения (например, ваш OneAppPerTest). Таким образом, вы можете придать поле в ваш тестовый набор, если вам нужно что-нибудь от DI графика:

val example = app.injector.instanceOf[Example] 

Так что ваш исходный код правильный подход, смешанный с помощью инжектора непосредственно. Это может выглядеть примерно так:

class UserSpec extends PlaySpec with OneAppPerSuite 
       with BeforeAndAfter with AsyncAssertions { 

    implicit val exec : ExecutionContext = app.injector.instanceOf[ExecutionContext] 
    val db : DBConnectionPool = app.injector.instanceOf[DBConnectionPool] 

    // ... 

} 

Насколько Настроив DI привязок для испытаний идет, вы можете изменить их настройки экземпляра приложения через GuiceApplicationBuilder см Creating Application Instances for Testing и Testing with Guice.

+0

Спасибо, теперь он компилируется, но когда я запускаю тест, я получаю следующую ошибку: «Исключение встречается при попытке запустить пакет с именем класса : org.scalatest.DeferredAbortedSuite '' java.lang.NullPointerException: 'в строке' app.injector.asInstaceOf'. Любая идея о том, как ее решить, пожалуйста? – Moebius

+0

Это 'instanceOf', а не' asInstanceOf' (это для кастинга - и у вас там тоже опечатка). Вероятно, это проблема. – alextsc

+0

Спасибо, я использовал 'instanceOf'. Все еще проблема. Вы можете воспроизвести ошибку, клонировав это репо: https://github.com/gbersac/electricity_manager/tree/dependencyInjection и checkout для 'dependencyInjection'. – Moebius

0

При тестировании класса, который нуждается в инъекции зависимостей, этим классам требуется приложение, которое вводит объект в эти классы. В тесте вам необходимо вручную создать это приложение. Сделайте это, добавив следующую строку в начале вашего тестового набора:

import play.api.inject.guice.GuiceApplicationBuilder 
class UserSpec extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions { 
    override def newAppForTest(td: TestData) = new GuiceApplicationBuilder().build() 
    [...] 

Обратите внимание, что вы можете изменить это приложение со специальным конфом для испытаний. См. the play documentation for more details.

Приложение, которое я создал для этого случая, крошечный и с открытым исходным кодом. См. Более подробную информацию о том, как я это сделал: https://github.com/gbersac/electricity_manager