我有很多使用 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
文件(它似乎有效,但我不确定这是正确的还是最好的方法...
最佳答案
设置 Sys.setenv("LANGUAGE"= "EN")
也适用于我。
但是,当使用 devtools::test()
进行测试时 - 就像 Rstudio 中的 ctrl + shift + T 一样 - 我不得不调用 Sys.setenv()
tests/testthat/ 目录中的测试脚本。原因是 devtools::test()
将调用 testthat::test_dir()
绕过 tests/testthat.R 文件。
到目前为止,这没有不良副作用。环境变量将仅为该特定 R 进程设置,如 help page 中所述。 :
Sys.setenv sets environment variables (for other processes called from within R or future calls to Sys.getenv from this R process).
为了完整起见,您还可以在 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")
关于r - 如何确保testthat单元测试中的英文错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47977951/