【问题标题】:Retrieving expected data.frame for testthat expectation检索预期的 data.frame 以测试预期
【发布时间】:2015-06-12 21:29:14
【问题描述】:

我想测试一个函数是否返回了预期的 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 的好方法是什么?

【问题讨论】:

  • 我没有使用过这个(因此未经测试),但是system.file() 在这里不适用吗?它允许您指定一个包,然后指定从包库到文件的路径位。所以试试path_expected &lt;- system.file("inst", "test_data", "project_longitudinal", expected", "default.rds")...
  • 这有帮助。我对环境分心了,忘记了测试过程会改变工作目录。出于某种原因,我遇到了path_qualified &lt;- base::system.file("inst/test_data/project_longitudinal/expected/dummy.rds", package="REDCapR") 的麻烦。但是path_qualified &lt;- base::file.path(devtools::inst(name="REDCapR"), "test_data/project_longitudinal/expected/dummy.rds") 有效。如果您发布官方答案,将我指向工作目录问题,我很乐意接受。

标签: r unit-testing dataframe testthat


【解决方案1】:

根据@Gavin Simpson 的评论,问题不涉及环境,而是文件路径。更改 snippet's second line 有效。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢@Peter Verbeet 解决更大的问题。我将文件路径解决方案标记为答案,因为它更直接地解决了这个特定问题。不过我很高兴我了解了ensurer 包并计划在未来使用它。在小插图中,我喜欢模板的想法。这似乎是一种快速使测试套件更加细化的好方法。这将允许套件识别返回的结构何时正确,但值不正确(因此更直接地指向问题代码)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2016-09-18
    • 2021-12-24
    • 2019-04-25
    • 1970-01-01
    • 2012-04-05
    • 2012-02-25
    相关资源
    最近更新 更多