在testthat单元测试

时间:2016-11-09 01:36:34

标签: r data.table testthat

使用单个测试文件运行devtools :: test()时出错,如下所示。然而,在自己运行test_that语句时(或逐行内的代码),它完美地运行,即myDt1有一列(y)而myDt有两列列(x和z),expect_equal语句满足,没有失败,没有运行时错误...

当然,我必须做错事,但我看不出明显的事!这似乎与依赖于NSE(非标准评估)的data.table的特征有关,暂时与一些NSE和其他使用的测试魔法相冲突?

帮助!

context("data.table and testthat do not play nice ?")
library(data.table)

test_that("data.table ", {

  # the following runs perfectly on it own
  # but fails when run as a test.
  myDt <- data.table(x=rnorm(10), y=rnorm(10), z=rnorm(10))
  targetCols <- c("y")

  myDt1 <- myDt[, targetCols, with=FALSE]
  expect_equal(ncol(myDt1), 1)

  myDt2 <- myDt[, !targetCols, with=FALSE]
  expect_equal(ncol(myDt2), 2)
})

在测试模式下我得到的错误是: &#34; 1。失败&#34;是因为myDt1没有被创建,它是NULL,没有产生错误。 &#34; 2。错误&#34;表示!targetCols无法正确解释。在devtool :: test()框架之外运行时,这些都不会发生。

> devtools::test()
Loading myLib
Testing myLib
data.table and testthat do not play nice ?: 12

Failed -----------------------------
1. Failure: data.table  (@testSimple.R#9) ----------------
ncol(myDt1) not equal to 1.
target is NULL, current is numeric


2. Error: data.table  (@testSimple.R#11) -----------------
invalid argument type
1: myDt[, !targetCols, with = FALSE] at D:\GitRepos\BlueMoon/tests/testthat/testSimple.R:11
2: `[.data.table`(myDt, , !targetCols, with = FALSE) at D:\GitRepos\BlueMoon/tests/testthat/testSimple.R:11
3: `[.data.frame`(x, i, j)

DONE ========================================================================
>

1 个答案:

答案 0 :(得分:1)

问题解决了: NAMESPACE文件中没有import(data.table)命令。 添加它解决了这个问题。在我的情况下,我添加间接,因为我使用roxygen,即使用

#' @import data.table
NULL

在一个或多个源文件中。这里,注释一个NULL对象,但也可以是使用data.table库的任何一个函数。 (当所述用法普遍存在时,以跟踪使用该软件包的所有函数的方式添加这些内容没有任何实际好处。)