如何确保测试单元测试中的英语错误消息

时间:2017-12-26 11:27:33

标签: r locale testthat

我使用期望英文错误消息的testthat包进行了大量的单元测试。

如果其他开发人员在配置为非英语语言环境的计算机上运行测试,则会以其他语言发出错误消息,并且我的测试失败。

如何在测试运行时初始化testthat以更改语言设置,而无需手动或永久地从R外部更改语言或测试环境(例如,此处提议:in R how to get error messages in english)?

library(testthat)
# works only in english locales...
expect_error(log("a"), "non-numeric argument to mathematical function", fixed = TRUE)

编辑1:在运行时更改语言环境不会更改错误消息的语言(使用Ubuntu和OSX High Sierra):

Sys.setlocale( locale = "en_US.UTF-8")
Sys.getlocale()  # en_US is active now but messages are still in another language

编辑2:似乎Sys.setenv("LANGUAGE"="EN")似乎立即更改了错误消息语言(使用OSX测试)。我应该把这个命令放在哪里进行测试?在testthat.R文件?

The R console is in German language, how can I set R to English?

编辑3:作为第一个解决方案,我已经放了

Sys.setenv("LANGUAGE"="EN")  # work-around to always create english R (error) messages

进入我的testthat.R文件下的测试文件夹(它似乎有效,但我不确定这是正确的还是最好的方式......

1 个答案:

答案 0 :(得分:1)

设置Sys.setenv("LANGUAGE" = "EN")也适用于我。

但是,当使用devtools::test()进行测试时-正如Rstudio中的ctrl + shift + T一样-我必须在 tests / testthat / Sys.setenv() >目录。原因是devtools::test()将绕过 tests / testthat.R 文件调用testthat::test_dir()

到目前为止,这还没有不良的副作用。如help page中所述,只会为该特定的R进程设置环境变量:

  

Sys.setenv设置环境变量(用于从R内调用的其他进程或此R进程对Sys.getenv的将来调用)。

为完整起见,您还可以在Windows上再次取消设置变量(请参见注释)。

  Sys.setenv("LANGUAGE" = "DE")
  expect_error(log("a"), "Nicht-numerisches Argument")
  Sys.setenv("LANGUAGE" = "FR")
  expect_error(log("a"), "argument non numérique ")
  Sys.unsetenv("LANGUAGE")

RStudio可能还会带来麻烦(我无法在那里交互地更改语言),但是在使用devtools::test()执行时,它可以工作。

最后,将其包装在辅助函数中。

expect_error_lang <- function(..., lang = "EN") {
    Sys.setenv("LANGUAGE" = lang)
    expect_error(...)
    Sys.unsetenv("LANGUAGE")
  }
#...
expect_error_lang(log("a"), "non-numeric")
expect_error_lang(log("a"), "Nicht-numerisches", lang = "DE")
expect_error_lang(log("a"), "argument non", lang = "FR")