无法在单元测试中从消息文件中读取消息

时间:2018-06-11 19:56:55

标签: playframework-2.6

我想从messages文件中读取错误消息,但我无法读取。我犯了什么错误?

我想从messages文件中读取字符串的代码是

Future {  Ok(Json.toJson(JsonResultError(messagesApi("error.incorrectBodyType")(langs.availables(0))))) }

messages文件error.incorrectBodyType=Incorrect body type. Body type must be JSON

messagesApi(" error.incorrectBodyType")应返回Incorrect body type. Body type must be JSON,但会返回error.incorrectBodyType

如果我删除messagesApi(error.incorrectBodyType)中的双引号,则代码无法编译

更新

我添加了几个调试打印,并注意到我在MessagesApi中使用的密钥未定义。虽然我已经在messages文件中创建了它们,但我不知道为什么。

println("langs array"+langs.availables)
        println("app.title"+messagesApi.isDefinedAt("app.title")(langs.availables(0)))
        println("error"+messagesApi.isDefinedAt("error.incorrectBodyType")(langs.availables(0)))

打印

langs arrayList(Lang(en_GB))
app.titlefalse
errorfalse

更新2 我可能已经找到了问题,但我不知道如何解决它。基本上,我正在运行我的测试用例而没有Application的实例。我通过调用mocking中定义的stubMessagesApi()Helpers.stubControllerComponents messagesApi,如果我使用Application运行相同的代码,例如class UserControllerFunctionalSpec extends PlaySpec with OneAppPerSuiteWithComponents,那么app.title和{ {1}}已定义。似乎没有error的实例,Application没有使用MessagesApi文件。

1 个答案:

答案 0 :(得分:0)

我可以使用MessagesApi

创建DefaultMessagesApi的新实例来解决问题
val messagesApi = new DefaultMessagesApi( //takes map of maps. the first is the language file, the 2nd is the map between message title and description
    Map("en" -> //the language file
      Map("error.incorrectBodyType" -> "Incorrect body type. Body type must be JSON") //map between message title and description
    )
  )
  val controller = new UserController(mockUserRepository,mockControllerComponents,mockSilhouette,messagesApi,stubLangs())