我使用期望英文错误消息的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
文件下的测试文件夹(它似乎有效,但我不确定这是正确的还是最好的方式......
答案 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")