testthat в R: поиск в проверенных файлах

Я использую пакет testthat в R и пытаюсь протестировать функцию, определенную в файле example.R. Этот файл содержит вызов source("../utilities/utilities.R"), где utilities.R - это файл с функциями, написанными мной. Однако, когда я пытаюсь протестировать функцию из example.R, поиск ее в сценарии тестирования дает следующую ошибку:

Error in file(filename, "r", encoding = encoding) : 
  cannot open the connection
In addition: Warning message:
In file(filename, "r", encoding = encoding) :
  cannot open file '../utilities/utilities.R': No such file or directory

Не могли бы вы уточнить, как запускать тесты для функций в файлах, которые являются источником другого файла?


person paljenczy    schedule 18.07.2014    source источник
comment
Вы пробовали положить этот файл в ту же папку?   -  person Andrie    schedule 18.07.2014
comment
Помещение файла в тот же каталог и поиск его как source("utilities.R") в example.R не помогает: я получаю похожее сообщение об ошибке.   -  person paljenczy    schedule 18.07.2014


Ответы (3)


Может быть немного поздно, но я нашел решение. Test_that устанавливает каталог, содержащий тестовый файл, в качестве текущего рабочего каталога. См. приведенный ниже код из test-files.r. Это приводит к тому, что рабочий каталог будет /tests. Следовательно, ваши основные сценарии должны иметь исходный код ("../file.R"), который подходит для тестирования, но не для запуска вашего приложения.

https://github.com/hadley/testthat/blob/master/R/test-files.r

source_dir <- function(path, pattern = "\\.[rR]$", env = test_env(),
                       chdir = TRUE) {
  files <- normalizePath(sort(dir(path, pattern, full.names = TRUE)))
  if (chdir) {
    old <- setwd(path)
    on.exit(setwd(old))
  }

Решение, которое я нашел, состояло в том, чтобы добавить setwd("..") в мои тестовые файлы и просто указать имя файла без пути. источник("файл.R") вместо источника("../файл.R"). Кажется, работает для меня.

person user3137190    schedule 14.01.2015
comment
Поскольку мои тесты, данные и функции находятся в отдельных папках, я обнаружил, что мне нужно назначить рабочий каталог как таковой wd ‹-file.path(getwd(),'..'), а затем указать functions_dir ‹-файл .path(wd, 'функции') и data_dir ‹- file.path(wd, 'data') внутри вспомогательного файла. Затем каждый тестовый файл будет иметь доступ к этим переменным для получения своих функций и данных. - person Todd; 18.07.2015

test, который позволяет вам определять и использовать вспомогательные файлы (см. ?source_test_helpers):

Вспомогательные сценарии — это сценарии R, сопровождающие тестовые сценарии, но с префиксом helper. Эти сценарии запускаются один раз перед запуском тестов.

Итак, что отлично сработало для меня, так это просто поместить файл «helper-functions.R», содержащий код, который я хочу получить, в «/tests/testthat/». Вам не нужно самостоятельно вызывать source_test_helpers(), testthat сделает это автоматически при запуске тестов (например, через devtools::test() или testthat::test_dir()).

person hplieninger    schedule 16.08.2018

Я не нашел отличного решения этой проблемы, до сих пор я устанавливал рабочий каталог в каждом тесте, используя пакет here.

test_that('working directory is set',{
  setwd(here())
  # test code here
})
person Kyouma    schedule 28.10.2020