Добавлено некоторое время спустя: теперь мы выбираем вариант 2 из здесь вместо изменения теста. Оглядываясь назад, кроссплатформенная воспроизводимость важнее ;-)
Как описано здесь, логика сортировки изменилась. Мой вопрос в том, как я могу пройти следующий тест на LC_COLLATE=German_Switzerland.1252
?
Воспроизводимый пример: создайте пакет, назовите его testort, добавьте test-environment с помощью usethis::use_testthat()
и добавьте файл test-sort.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.
Использование with_collate(new, code)Временно изменить глобальные параметры.
Использование with_options(new, code)Временно изменить переменные системной среды.
Использование with_envvar(new, code, action = replace)