检索预期 data.frame 以测试预期
Retrieving expected data.frame for testthat expectation
我想测试一个函数 returns 是否符合预期 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 的好方法是什么?
我建议您查看优秀的 ensurer
软件包。您可以将这些函数包含在函数本身中(而不是作为 testthat
测试集的一部分)。
如果数据框(或您要检查的任何对象)不满足您的要求,它将抛出错误,并且如果它通过您的测试,它只会 return 该对象。
testthat
的不同之处在于 ensurer
是为了在 运行 时检查你的对象,这可能会绕过你面临的整个环境问题,因为对象是在函数内部测试的 运行时间。
请参阅 this vignette 的末尾,了解如何根据您可以制作的尽可能详细的模板测试数据框。您还会在函数内找到许多其他可以 运行 的测试。在这种情况下,这种方法似乎比 testthat
更可取。
根据@Gavin Simpson 的评论,问题不涉及环境,而是文件路径。更改 snippet's second line 有效。
path_qualified <- base::file.path(
devtools::inst(name="REDCapR"),
test_data/project_longitudinal/expected/dummy.rds"
)
无论我是在交互式调试还是在测试 运行(因此 inst
是否在路径中),都会找到文件的位置。
我想测试一个函数 returns 是否符合预期 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 的好方法是什么?
我建议您查看优秀的 ensurer
软件包。您可以将这些函数包含在函数本身中(而不是作为 testthat
测试集的一部分)。
如果数据框(或您要检查的任何对象)不满足您的要求,它将抛出错误,并且如果它通过您的测试,它只会 return 该对象。
testthat
的不同之处在于 ensurer
是为了在 运行 时检查你的对象,这可能会绕过你面临的整个环境问题,因为对象是在函数内部测试的 运行时间。
请参阅 this vignette 的末尾,了解如何根据您可以制作的尽可能详细的模板测试数据框。您还会在函数内找到许多其他可以 运行 的测试。在这种情况下,这种方法似乎比 testthat
更可取。
根据@Gavin Simpson 的评论,问题不涉及环境,而是文件路径。更改 snippet's second line 有效。
path_qualified <- base::file.path(
devtools::inst(name="REDCapR"),
test_data/project_longitudinal/expected/dummy.rds"
)
无论我是在交互式调试还是在测试 运行(因此 inst
是否在路径中),都会找到文件的位置。