r - data.table和testthat包

uta*_*tal 8 r testthat data.table r-package

我正在构建一个使用data.table的包,应该使用package testthat进行测试.虽然代码在从命令行调用时工作正常,但在从测试用例调用时会遇到问题.似乎在运行测试时使用了基本包中的[]函数,即data.frames的函数.

我创建了一个最小的例子,可以在这里找到:https://github.com/utalo/test_datatable_testthat

该软件包包含一个函数:

test <- function() {
   dt <- data.table(MESSAGE="Test 1234567890",TYPE="ERROR")
   dt[,.(MESSAGE=strwrap(MESSAGE,width = 10)),by=.(TYPE)]
}
Run Code Online (Sandbox Code Playgroud)

test.datatable.testthat:::test()从命令行调用时,我得到了预期的结果:

    TYPE    MESSAGE
 1: ERROR       Test
 2: ERROR 1234567890
Run Code Online (Sandbox Code Playgroud)

但是,在执行以下单元测试时:

test_that("Test package",{
  dt <- test()

  expected_res <- structure(list(TYPE = c("ERROR", "ERROR"),
                             MESSAGE = c("Test","1234567890")),
                        row.names = c(NA, -2L), class = c("data.table","data.frame"),
                        .Names = c("TYPE", "MESSAGE"))

  expect_equal(dt,expected_res)
})
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

1
1. Error: Test package -------------------------------------------------------------------------------------------------------
could not find function "."
1: withCallingHandlers(eval(code, new_test_environment), error = capture_calls, message = function(c) invokeRestart("muffleMessage"))
2: eval(code, new_test_environment)
3: eval(expr, envir, enclos)
4: test() at test.R:4
5: dt[, .(MESSAGE = strwrap(MESSAGE, width = 10)), by = .(TYPE)] at test.datatable.testthat/R/hello.R:5
6: `[.data.table`(dt, , .(MESSAGE = strwrap(MESSAGE, width = 10)), by = .(TYPE)) at C:\Users\D057806\Documents\R\test.datatable.testthat/R/hello.R:5
7: `[.data.frame`(x, i, j)
Run Code Online (Sandbox Code Playgroud)

如您所见,在测试中调用了data.frame的[].我的第一个猜测是没有正确声明对data.table包的依赖.这是我的描述文件:

Package: test.datatable.testthat
Type: Package
Title: What the Package Does (Title Case)
Version: 0.1
Date: 2016-04-07
Authors@R: person("First", "Last", email = "first.last@example.com", role = c("aut", "cre"))
Description: More about what it does (maybe more than one line)
License: What license is it under?
LazyData: TRUE
Depends:
    data.table
Suggests:
     testthat
RoxygenNote: 5.0.1
Run Code Online (Sandbox Code Playgroud)

根据我自己的包中的Using data.table包,将data.table声明为依赖包就足够了.但是,这似乎不是这种情况.

关于为什么我的函数在被直接调用时工作但在testthat的上下文中没有的任何线索?

jan*_*cki 1

太渴望评论所以发布作为答案。

\n\n
    \n
  1. 不要在包名称中使用下划线,它违反了标准。下划线将变成点。

  2. \n
  3. 无法真正告诉您为什么 testthat 无法处理您的测试。您可以尝试导出test功能。它不会导出,因此只能:::显式使用。也许 testthat 在某种程度上依赖于此,我不知道。

  4. \n
  5. 当我将测试移出 testthat 时,测试就通过了。如果您无法解决它,我会在 testthat 问题中寻求支持。

  6. \n
\n\n

您可以看到您的 pkg 的 fork jangorecki/test_datatable_testthat(从现在起几天后,URL 将无法工作,因此如果您想稍后访问它们,请获取更改)。
\n您的测试已移出tests/test.R以下内容中的测试。

\n\n

\n\n

dt <- test.datatable.testthat:::test()\nexpected_res <- structure(list(TYPE = c("ERROR", "ERROR"),\n                               MESSAGE = c("Test","1234567890")),\n                          row.names = c(NA, -2L), class = c("data.table","data.frame"),\n                          .Names = c("TYPE", "MESSAGE"))\nstopifnot(all.equal(dt,expected_res))\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试该测试通过将其更改为虚拟来抑制,类似于TRUE==TRUE。\n现在您的测试在 testthat 之外定义,通过了。
\n相关部分来自00check.log

\n\n
* checking tests ...\n  Running \xe2\x80\x98test.R\xe2\x80\x99\n  Running \xe2\x80\x98testthat.R\xe2\x80\x99\n OK\n* DONE\n
Run Code Online (Sandbox Code Playgroud)\n