r - 如何确保testthat单元测试中的英文错误消息

标签 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 文件(它似乎有效,但我不确定这是正确的还是最好的方法...

最佳答案

设置 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/

相关文章:

android - 用 TTS 说话,例如印地语

r - 写入磁盘的测试包函数

html - 如何将网站表中的数据加载到 R 环境中?

具有主类的 C++ 正则表达式不匹配

internationalization - 如何使用 r.js 和 hbs.js 使用多个语言环境

r - 当条件不满足时跳过所有测试

r - 查找先前出现的值并在相对列中获取值

r - 有效解析 R 中的二进制输入

r - 计算向量中每个值的对应十分位数