runit-testingdataframetestthat

Retrieving expected data.frame for testthat expectation


I'd like to test that a function returns the expected data.frame. The data.frame is too large to define in the R file (eg, using something like structure()). I'm doing something wrong with the environments when I try a simple retrieval from disk, like:

test_that("SO example for data.frame retreival", {   
  path_expected <- "./inst/test_data/project_longitudinal/expected/default.rds"
  actual <- data.frame(a=1:5, b=6:10) #saveRDS(actual, file=path_expected)
  expected <- readRDS(path_expected)
  expect_equal(actual, expected, label="The returned data.frame should be correct")
})

The lines execute correctly when run in the console. But when I run devtools::test(), the following error occurs when the rds/data.frame is read from a file.

1. Error: All Records -Default ----------------------------------------------------------------
cannot open the connection
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls, message = function(c) invokeRestart("muffleMessage"), 
       warning = function(c) invokeRestart("muffleWarning"))
2: eval(code, new_test_environment)
3: eval(expr, envir, enclos)
4: readRDS(path_expected) at test-read_batch_longitudinal.R:59
5: gzfile(file, "rb")

To make this work, what adjustments are necessary to the environment? If there's not an easy way, what's a good way to test large data.frames?


Solution

  • Based on the comment by @Gavin Simpson, the problem didn't involve environments, but instead the file path. Changing the snippet's second line worked.

    path_qualified <- base::file.path(
        devtools::inst(name="REDCapR"),
        "test_data/project_longitudinal/expected/dummy.rds"
    )  
    

    The file's location is found whether I'm debugging interactively, or testthat is running (and thus whether inst is in the path or not).