详细地说,我编写了一个包(尚未发布),它使用memoise(https://github.com/hadley/memoise)来缓存基于持久互联网REST查询的结果。缓存的位置是包的配置选项(由配置文件或环境设置),并且在加载包时必须初始化缓存的函数。如果需要,应手动删除缓存,因为在线数据不会经常更新。
如何让我的测试使用与“普通”
不同的缓存区域以防止意外覆盖和
通过始终以空缓存开始来使测试可重现?
思路:
当然,从来没有不可能,在写这篇文章之前,我试着找几个小时的解决方案。我在stackoverflow上看到了一个关于数据库的类似问题 - 没有答案。
我找到的唯一方法是commandArgs()。这些可能会有所不同,具体取决于测试的运行方式(devtools,R CMD检查......),但它们总是与生产不同。不过,我必须知道所有可能/合理/通常的方法来运行测试。
当使用 时,test目录中的test.hat文件不会始终使用?如果testthat.R文件不,则如何完成包加载,例如由devtools?
经过一天的思考后编辑:检测,如果从测试运行: 我提出以下代码来检测,如果代码当前正在测试(我不喜欢这个选项,因为测试不太有用,如果测试代码在测试中表现不同,请记住大众 - 柴油发动机):
testing<-as.logical(any("devtools::test()" == commandArgs()))
args = commandArgs()[grep("(^|/|\\|:|nextArg)PACKAGE_NAME.Rcheck(nextArg|$)", commandArgs(), perl = TRUE)]
args2 = unlist(strsplit(args, "nextArg"))
testing=as.logical(testing || (length(grep("(^|/|\\|:)PACKAGE_NAME.Rcheck$", args2)) > 0))
((用包裹名称替换PACKAGE_NAME))
解决问题: 在我的情况下,我看到我现在将选择的另一个选项,即使这不回答我的问题,我仍然感兴趣。而不是在测试中调用缓存状态相关的函数,我将有未缓存的版本的测试功能。对于生产,此版本随后由memoise封装。一个简单的平方函数的例子:
# not exported
.f <- function(x) {
return(x*x);
}
# exported
f <- memoise(.f, cache = c)
在测试中,我可以写:
expect_equal(.f(2), 4);
但是在制作中:
four <- f(2)
很抱歉打扰,没看到明显的,但是,你怎么处理这种情况?我知道with_mock,但对于包初始化步骤,这并不总是一个选项。