使用’testthat’测试包导出

问题:如何在加载我的包的环境中运行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检查设置的工作目录.

点赞