0

我想测试一个函数是否返回了预期的data.frame。data.frame 太大而无法在 R 文件中定义(例如,使用类似的东西structure())。当我尝试从磁盘进行简单检索时,我的环境出现了问题,例如:

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")
})

在控制台中运行时,这些行正确执行。但是当我运行devtools::test()时,从文件中读取 rds/data.frame 时会出现以下错误。

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")

要做到这一点,需要对环境进行哪些调整?如果没有简单的方法,那么测试大型 data.frames 的好方法是什么?

4

2 回答 2

2

我建议你看看优秀的ensurer包。您可以将这些函数包含在函数本身中(而不是作为testthat测试集的一部分)。如果数据框(或您要检查的任何对象)不满足您的要求,它将引发错误,并且如果它通过您的测试,它将仅返回该对象。不同之testthat处在于它ensurer是为在运行时检查您的对象而构建的,这可能会绕过您面临的整个环境问题,因为该对象是在运行时在函数内部进行测试的。请参阅此小插图的结尾,了解如何根据模板测试数据框,您可以根据需要制作尽可能详细的模板。您还会发现可以在函数内运行的许多其他测试。看起来这种方法可能比testthat在这种情况下。

于 2015-04-23T07:11:28.720 回答
0

根据@Gavin Simpson 的评论,问题不涉及环境,而是文件路径。更改片段的第二行有效。

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

无论我是在交互式调试还是在运行测试(因此是否inst在路径中),都可以找到文件的位置。

于 2015-05-03T20:45:08.163 回答