稍后添加:我们现在从这里选择选项2,而不是更改测试。回过头来看,跨平台再现性更为重要;-(
如上所述,排序逻辑发生了变化。我的问题是,我如何才能在LC_COLLATE=German_Switzerland.1252
上通过以下测试?
可复制的例子:创建一个包,称之为testsort,使用usethis::use_testthat()
添加测试环境并添加一个文件"测试排序。R〃;在/testsort/tests/testthat/
中
test_that("test sort", {
xx <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
expect_equal(sort(xx), c("Schaffhausen", "Schwyz", "Seespital", "SRZ")) # fails with new sort
})
背景:我们有很多项目,我们总是在LC_COLLATE=German_Switzerland.1252
上工作,并对德语名称进行排序/比较,另请参阅此处。在我们的逻辑中;R〃;在";c";我们想测试一下,我们在项目中有什么/期望什么,这就是问题所在。此外,我们希望尽量减少对其他包的依赖,例如,如果可能的话,避免使用stringr::str_sort(, locale = ...)
。
似乎只有当testthat
/testthat::test_dir
被调用时,关键部分才会发生:
withr::with_collate("C", # new code
withr::with_options(c(useFancyQuotes = FALSE), # new code
withr::with_envvar(c(r_env_vars(), TESTTHAT_PKG = pkg$package), # code
do.call(testthat::test_dir, testthat_args))))
来自文档:
通过更改LC_COLLATE区域设置的值来临时更改排序规则顺序
与_collate(new,code(一起使用暂时更改全局选项
使用选项(新,代码(暂时更改系统环境变量
使用_envvar(new,code,action="replace"(
怎么样
test_that("test sort", {
# capture current locale
locale <- Sys.getlocale("LC_COLLATE")
# set desired locale for test (eg English)
if (.Platform$OS.type == "windows") {
invisible(Sys.setlocale("LC_COLLATE", "English"))
} else {
invisible(Sys.setlocale("LC_COLLATE", "en_US.UTF-8"))
}
# run test
xx <- c("Schaffhausen", "Schwyz", "Seespital", "SRZ")
expect_equal(sort(xx), c("Schaffhausen", "Schwyz", "Seespital", "SRZ"))
# return to original locale
invisible(Sys.setlocale("LC_COLLATE", locale))
})