使用'testthat'测试包导出

时间:2015-10-23 15:06:57

标签: r namespaces testthat

问题:如何让<{1}}在加载我的软件包的环境中运行,而不是继承自 my包装

后台: testthat包在继承自包名称空间环境的环境中运行测试“[请参阅test_check的文档]。这意味着它无法确保我正确地完成了我的出口,并且这几次被咬了我。

例如,我的包中有以下代码:

testthat

以下在我的测试中:

##' 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添加一个选项来选择所需的行为?

1 个答案:

答案 0 :(得分:1)

使用test_dir。出于这个原因,我不会使用test_check。在&#34; /tests/run-tests.R" (文件名并不重要,它只需要在该目录中并以&#34; .R&#34;)结束写:

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设置的工作目录。