Hi,
The setup is that I am trying to test an R package which requires another external software to be installed and running in the shell. I am downloading the latest software from Github in tests/testthat/setup.R
so that it runs once for all tests, and then using a helper function in tests/testthat/helper-oms.R
to execute the command in the shell for each test (and kill the process once each test ends).
I am trying to follow the advice from the testthat
documentation here: Test fixtures • testthat
While I debug, I am downloading the files to my desktop, but eventually I will use tempdir()
instead.
In general, this is working, however the code withr::defer(unlink(oms_path), teardown_env())
in setup.R
is not removing the file at oms_path
after all tests complete and the following message is produced in the Build pane: No deferred expressions to run
. Any idea why the unlink
ing isn't working to cleanup files?
# setup.R
local_install_openmpp <- function() {
url <- 'https://github.com/openmpp/main/releases/latest/download/openmpp_mac_arm64_20241226.tar.gz'
file <- fs::path_file(url)
dir <- '/Users/matt/Desktop/'
path <- paste(dir, file, sep = '/')
download.file(url, path)
untar(path, exdir = dir)
unlink(path)
new_path <- fs::path_ext_remove(fs::path_ext_remove(path))
new_path
}
oms_path <- local_install_openmpp()
withr::defer(unlink(oms_path, recursive = TRUE), teardown_env())
# helper-oms.R
local_initiate_oms <- function(path) {
pid <-
withr::with_dir(
new = path,
code = sys::exec_background(cmd = './bin/oms', std_out = FALSE)
)
Sys.sleep(1)
withr::defer_parent(tools::pskill(pid))
pid
}
# test-connections.R
test_that("API connection succeeds", {
local_initiate_oms(oms_path)
use_OpenMpp_local()
expect_no_error(get_models())
expect_no_error(get_models_list())
})
FWIW, replacing my entire setup.R
with the example shown at the link above doesn't work either...
# setup.R
# Run before any test
write.csv(mtcars, "/Users/matt/Desktop/mtcars.csv")
# Run after all tests
withr::defer(unlink("/Users/matt/Desktop/mtcars.csv"), teardown_env())