使用'testthat'测试软件包的导出内容

4

问题: 如何让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声明,但很遗憾测试并没有发现这一点。
我更希望从用户的角度运行所有测试,因为我有时会弄错我的导出。也许可以向testthat:::run_tests添加选项来选择所需的行为?
1个回答

1
请使用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 buildR CMD check来运行测试。

如果您的测试不关心工作目录,则setwd不是必需的。但是,如果需要,请这样做将复制由R CMD check设置的工作目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接