ошибка загрузки пакета внутри foreach при использовании testthat

Я пытаюсь решить проблему с использованием модульных тестов с помощью testthat. Код работает нормально, если запускать вручную, однако кажется, что при запуске test() рабочие внутри foreach, похоже, не имеют доступа к пакету или функциям внутри пакета, который я тестирую. Код довольно сложный, поэтому у меня нет отличного рабочего примера, но вот схема структуры:

модульный тест в тестах/testthat:

test_that("dataset runs successful", {
  expect_snapshot_output(myFunc(dataset, params))
})

MyFunc вызывает другую функцию и внутри этой функции создает воркеров для запуска некоторого кода:

final_out <- foreach(i = 1:nrow(data), 
    .combine = c, 
    .export = c("func1", "func2", "params"),
    .packages = c("fields", "dplyr")) %dopar% {
    output = func1(stuff)
    more = func2(stuff)
    out = rbind(output, more)
    return (out)
}

У рабочих, похоже, нет доступа к func1, func2 и т. д.

Я пытался добавить имя пакета к пакетам в этой строке, но это тоже не работает.

Любые идеи? Как я уже упоминал, это проблема только при попытке запустить модульные тесты, и я подозреваю, что это как-то связано с тем, как загружается тестируемый пакет?


person Paul    schedule 09.04.2021    source источник


Ответы (1)


Когда рабочие процессы запускаются, они не имеют полного набора пакетов, который есть в обычном сеансе; передать все имена пакетов в пути поиска, когда тесты выполняются в локальном сеансе, в аргумент .packages.

person CSJCampbell    schedule 09.04.2021
comment
Спасибо, я думал, что это может быть проблемой, но когда я попытался передать имя пакета, который я тестирую (это пакет, который мы разработали), он говорит, что пакет не найден. Func1, Func2 и т. д. являются частью этого пакета. Я также попытался адаптировать код внутри, чтобы указать, например: MyPackage::Func1, но это тоже не сработало. - person Paul; 12.04.2021
comment
Вы используете несколько библиотек? Может быть, рабочая сессия не подхватывает альтернативную библиотеку? Вы можете попробовать установить жестко закодированный путь к библиотеке в функции, чтобы увидеть, решит ли это ее. - person CSJCampbell; 13.04.2021
comment
Пакет, который, кажется, не загружается, - это пакет, который я разработал, и я пытаюсь выполнить модульные тесты. Я не знаю, где создается путь к библиотеке для этого, когда запускается devtools::test(), который затем будет доступен для рабочих? - person Paul; 05.05.2021
comment
На самом деле я думаю, что это была проблема с глобальным env, загружающим различные вещи ... с чистым env, после добавления имени пакета в .packages, все работает! - person Paul; 05.05.2021