r-如何为testhat中的所有测试全局更改LC_COLLATE=C



稍后添加:我们现在从这里选择选项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))
})

最新更新