2016-09-14 2 views
1

Новый проект-игра Ла Скала (v2.5.6) начинается с примерами тестов, как это:Scala Play: Как внедрить тестовую базу данных в контроллер для тестирования

"HomeController" should { 
    "render the index page" in { 
    val home = route(app, FakeRequest(GET, "/")).get 
    status(home) mustBe OK 
    } 
} 

и контроллер примеров, как этот, инжекции Database с Guice:

class DataManagementController @Inject()(db: Database) extends Controller {...} 

Я хотел бы проверить этот новый контроллер, как указано выше, но нагнетание теста в памяти базы данных вместо «по умолчанию». После нескольких часов я не могу этого добиться. Я нашел ключи в

(и внешний posts использованием FakeApplication, хотя они очень сложны, и я бы предпочел, чтобы следовать официальной, текущей версии, с Docs.)

От этого я понял, что есть аргумент implicit app, используемый в route(app, ...), поэтому я попытался его переопределить:

Покушение 1: (компилирует, но по-прежнему использует базы данных "по умолчанию")

class MySpec extends PlaySpec with OneAppPerSuite { 

    implicit override lazy val app = new GuiceApplicationBuilder() 
    .configure(inMemoryDatabase("test").build() 

    "DataManagementController" should { ... } 

ПОПЫТКА 2: (не компилируется: "Не удается разрешить символ" TestDb")

class MySpec extends PlaySpec with OneAppPerSuite { 

    val TestDb = Databases.inMemory(name="test") 

    implicit override lazy val app = new GuiceApplicationBuilder() 
    .overrides(bind[Database].to[TestDb]).build() 

    "DataManagementController" should { ... } 

Есть ли я на правильном пути?

ответ

1

не должно быть проблемой, но вы можете попробовать:

implicit override lazy val app = new GuiceApplicationBuilder() 
    .overrides(bind(classOf[Database]).to(classOf[TestDb]).build() 

вместо

implicit override lazy val app = new GuiceApplicationBuilder() 
    .overrides(bind[Database].to[TestDb]).build() 

и/или

"" should { 
    "" in new App(appBuilder) { 
    } 
} 

где appappBuilder является GuiceApplicationBuilder