Проиграть фреймворк с тестом интернационализации - PullRequest
0 голосов
/ 24 мая 2018

Когда я запускаю приложение Play Scala 2.6 с включенной интернационализацией, страница отображается со всем содержимым, правильно подобранным из моего файла messages.en.

Но когда я тестирую свой контроллер, один изПри проверке содержимого страницы тестирование не выполняется (contentAsString(result) must include ("Welcome to Play")).

Тест не пройден, поскольку содержимое страницы отображается как label.welcome_to_play вместо Welcome to Play!.Это происходит только тогда, когда я отображаю страницу индекса из нового экземпляра контроллера.Когда я тестирую, отрисовывая страницу из приложения или маршрутизатора, проходит тот же тест (contentAsString).

У вас есть идеи, почему это происходит?

Это мой HomeController.scala:

@Singleton
class HomeController @Inject()(cc: ControllerComponents)
  extends AbstractController(cc) with I18nSupport {

  def index() = Action { implicit request: Request[AnyContent] =>
    Ok(views.html.index())
  }
}

А это мой HomeControllerSpec.scala тест:

class HomeControllerSpec extends PlaySpec
  with GuiceOneAppPerTest
  with Injecting
  with Results {

  "Calling HomeController.index" should {

    "render the index page from a new instance of controller" in {
      val controller = new HomeController(stubControllerComponents())
      val result = controller.index().apply(FakeRequest(GET, "/"))

      status(result) mustBe OK
      contentType(result) mustBe Some("text/html")
      // THIS IS WHERE THE TEST FAILS. Content appears as "label.welcome_to_play"
      contentAsString(result) must include ("Welcome to Play")
    }

    "render the index page from the application" in {
      val controller = inject[HomeController]
      val home = controller.index().apply(FakeRequest(GET, "/"))

      status(home) mustBe OK
      contentType(home) mustBe Some("text/html")
      // WHILE THIS IS PASSING
      contentAsString(home) must include ("Welcome to Play")
    }

    "render the index page from the router" in {
      val request = FakeRequest(GET, "/")
      val home = route(app, request).get

      status(home) mustBe OK
      contentType(home) mustBe Some("text/html")
      // AND THIS IS PASSING
      contentAsString(home) must include ("Welcome to Play")
    }
  }
}

А это мой index.scala.html просмотр:

@()(implicit messagesProvider: MessagesProvider)

@main(messagesProvider.messages("label.welcome_to_play")) {
  <h1>@messagesProvider.messages("label.welcome_to_play")</h1>
}

Вот какмой messages.en файл выглядит следующим образом:

label.welcome_to_play = Welcome to Play!

В моем файле conf есть следующая конфигурация:

play.i18n {
  langs = [ "en" , "lv ]
}

Я попытался переименовать файл с messages.en на messages но это не помогло.

Кто-нибудь знает, почему тест не пройден?Почему файл сообщений не используется при рендеринге страницы из нового экземпляра моего контроллера?Заранее благодарю за помощь:)

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Я в итоге создал экземпляр DefaultMessagesApi с картой testMessages следующим образом:

Сначала я создал карту testMessages внутри своей HomeControllerSpec:

private val testMessages: Map[String, Map[String, String]] = Map(
  "en" -> Map(
    "label.welcome_to_play" -> "Welcome to Play!",
    "label.hello_world" -> "Hello world"
  )
)

Эта карта содержит только краткий список меток, которые я хочу проверить, и не является копией полного файла messages.en.

Затем в неудачном тесте я создаю новый экземплярHomeController путем переопределения messagesApi ...

"render the index page from a new instance of controller" in {
  val controller = new HomeController(stubControllerComponents()) {
    override val messagesApi = new DefaultMessagesApi(testMessages)
  }
  val result: Future[Result] = controller.index().apply(FakeRequest(GET, "/"))

  status(result) mustBe OK
  contentType(result) mustBe Some("text/html")
  contentAsString(result) must include ("Welcome to Play")
}

... и тест проходит.

Я признаю, что этот подход вызывает некоторое дублирование (метки сообщений как внутрифайл messages.en и Spec), но для небольших тестов с небольшим количеством сообщений для тестирования, я думаю, что это приемлемое решение.

0 голосов
/ 24 мая 2018

MessagesApi предоставляется ControllerComponents и будет содержать список сообщений и их перевод.

Когда вы используете stubControllerComponents, этот создаст MessagesApi объект с без сообщений .

Если вы хотите, чтобы ваши переведенные сообщения, вам нужно использовать другой ControllerComponents

...