2015-04-08 132 views
0

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

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

为了做到这一点,需要对环境进行哪些调整?如果没有简单的方法,测试大型数据框架的好方法是什么?

+1

我没有使用过这个(因此未经测试),但'system.file()'不适用于此?它允许您指定一个包,然后指定从包基到文件的路径位。所以给'path_expected < - system.file(“inst”,“test_data”,“project_longitudinal”,expected“,”default.rds“)'尝试... –

+0

这有助于我分心环境,忘记了测试过程改变了工作目录,出于某种原因,我遇到了'path_qualified < - base :: system.file(“inst/test_data/project_longitudinal/expected/dummy.rds”,package =“REDCapR”)的问题。 'path_qualified < - base :: file.path(devtools :: inst(name =“REDCapR”),“test_data/project_longitudinal/expected/dummy.rds”)'如果你发布一个正式的答案指向我的工作目录问题,我很乐意接受它 – wibeasley

回答

0

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

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

该文件的位置找到我是否调试交互,或testthat运行(因此inst是否在路径或没有)。

2

我建议你看看优秀的ensurer包。您可以将这些功能包含在功能本身中(而不是作为testthat测试装置的一部分)。 如果数据框(或任何你想检查的对象)不能满足你的要求,它会抛出一个错误,并且只要它通过了你的测试就返回对象。 与testthat的不同之处在于ensurer是为了在运行时检查对象而设计的,它可能会避免您面临的整个环境问题,因为对象在运行时在函数内部进行了测试。 请参阅this vignette的末尾,了解如何根据您可以制作的模板测试数据帧的详细程度。你还可以找到许多其他的测试,你可以在这个函数中运行。在这种情况下,看起来这种方法可能优于testthat

+0

感谢您处理更大的图片@Peter Verbeet,我将文件路径解决方案标记为答案,因为它更直接地解决了这个具体问题,但是我很高兴我了解到了'ensurer ''''''''''''''''''''''''''''''''''''''''''''在未来的包装和计划中ms像是一种快速使测试套件更加细化的好方法。这将允许套件识别何时返回的结构是正确的,但值不是(并因此更直接地指向问题代码)。 – wibeasley