我正在构建一个与data.table一起使用的程序包,应该使用test.that程序包对其进行测试。
虽然从命令行调用时代码工作正常,但从测试用例调用时却遇到了问题。在运行测试时,似乎使用了基本包中的[]函数,即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)]
}

从命令行调用test.datatable.testthat:::test()时,我得到了预期的结果:
    TYPE    MESSAGE
 1: ERROR       Test
 2: ERROR 1234567890

但是,在执行以下单元测试时:
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)
})

我收到一个错误:
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)

如您所见,在测试中,data.frame的[]被调用。
我的第一个猜测是对data.table包的依赖关系未正确声明。这是我的DESCRIPTION文件:
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 = "[email protected]", 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

根据Using data.table package inside my own package,将data.table声明为依赖包就足够了。但是,这里似乎并非如此。

关于为什么直接调用我的函数而不是在testthat上下文中为什么我的函数起作用的任何线索?

最佳答案

渴望发表评论,因此发布为答案。

  • 不要在包名称中使用下划线,这会违反标准。下划线将变为点。
  • 不能真正告诉您为什么testthat无法处理您的测试。您可以尝试导出test函数。它不会导出,因此仅应与:::一起显式使用。也许测试以某种方式依赖于此,不知道。
  • 当我将测试移出testthat时,测试通过了。如果您无法解决问题,我会在testthat问题上寻求支持。

  • 您可以看到我的pkg分支jangorecki/test_datatable_testthat(URL从现在起几天内将无法使用,因此,如果您以后要访问它们,请获取更改)。
    您的测试已移出tests/test.R(位于下面的内容中)中的test。
    dt <- test.datatable.testthat:::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"))
    stopifnot(all.equal(dt,expected_res))
    

    通过将测试更改为虚拟TRUE==TRUE来抑制测试。
    现在,您在测试之外定义的测试可以通过。00check.log的相关部分:
    * checking tests ...
      Running ‘test.R’
      Running ‘testthat.R’
     OK
    * DONE
    

    关于r-data.table和testthat包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36547235/

    10-12 17:52