问题:如何在加载我的包的环境中运行testthat,而不是继承自我的包?
背景:testthat包运行测试“在一个继承自包的命名空间环境的环境中”[参见test_check的文档].这意味着它不能确保我已经正确地完成了我的出口,并且这几次被咬了我.
例如,我的包中有以下代码:
##' The foo() method
##' @param x object
##' @export
foo <- function(x)
UseMethod('foo')
##' @rdname foo
foo.data.frame <- function(x) {
message("foo data.frame")
}
##' @rdname foo
foo.default <- function(x) {
message("foo default")
}
以下在我的测试中:
x <- 5:13
foo(x)
那个测试就好了.但是如果用户安装了包,他们就会收到此错误:
Error in UseMethod("foo") :
no applicable method for 'foo' applied to an object of class "c('integer', 'numeric')"
解决方案是为这两个方法添加@exports声明,但是测试没有捕获到这一点真是太糟糕了.
我更倾向于从用户的角度来运行我的所有测试,因为我倾向于搞砸我的导出.也许可以添加一个选项来测试::: run_tests,它可以选择所需的行为?
最佳答案 使用test_dir.我没有使用test_check这个确切的原因.在“/tests/run-tests.R”中(文件名无关紧要,只需要在该目录中并以“.R”结尾)写:
library(testthat)
library(<my package>) # insert actual package name here
test_dir('testthat') # assuming your tests are in "tests/testthat"
然后,为了运行您的测试:
setwd("<pkg dir>/tests")
source("run-tests.R")
或者从命令行:
cd <pkg-dir>/tests
Rscript run-tests.R
或者做R CMD构建和R CMD检查以这种方式运行测试.
如果您的测试不关心工作目录,则不一定需要setwd.但是,如果他们这样做,将复制由R CMD检查设置的工作目录.