devtools::test 自 devtools 1.13.4 和 testhat 2.0 以来我的包开始失败(带有 X 警告)
devtools::test started failing on my package (with X warning) since devtools 1.13.4 and testhat 2.0
我进行了重大编辑,因为我设法缩小了问题的范围:
我遇到了 devtools::test 的新问题。我的包曾经毫无问题地通过单元测试。但是在更新我的包(包括 devtools 和 testthat)之后它现在失败了。
可重现的例子:
我已经成功构建了一个可重现的示例:在新的包架构中。
foo.R: /R/
中的一个 R 文件
foo <- function(obj){
return(as.numeric(obj))
}
test_foo.R: /tests/testthat
中的uniit测试文件
test_that("Test my foo function: ",
{
expect_true(is.na(foo("1,5")))
})
testhat.R: 运行 我的单元测试在 /tests/
library(testthat)
library(foo)
test_check("foo")
两种场景
运行: devtools::test()
> devtools::test()
Loading foo
Loading required package: testthat
Testing foo
√ | OK F W S | Context
Error in x[[method]](...) : attempt to apply non-function
== Results =====================================================================
Duration: 0.1 s
OK: 0
Failed: 4
Warnings: 1
Skipped: 0
运行 testtjat::test_dir("tests/")
> testthat::test_dir("tests/")
√ | OK F W S | Context
== testthat results ===========================================================
OK: 2 SKIPPED: 0 FAILED: 0
== Results =====================================================================
Duration: 0.1 s
OK: 0
Failed: 0
Warnings: 0
Skipped: 0
环境
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=French_France.1252 LC_CTYPE=French_France.1252 LC_MONETARY=French_France.1252 LC_NUMERIC=C
[5] LC_TIME=French_France.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] foo_0.0.0.9000 testthat_2.0.0
loaded via a namespace (and not attached):
[1] Rcpp_0.12.15 roxygen2_6.0.1 rprojroot_1.3-2 crayon_1.3.4 assertthat_0.2.0 digest_0.6.14 withr_2.1.1 commonmark_1.4
[9] R6_2.2.2 backports_1.1.2 magrittr_1.5 cli_1.0.0 rlang_0.1.6 stringi_1.1.6 rstudioapi_0.7 xml2_1.1.1
[17] desc_1.1.1 devtools_1.13.4 tools_3.4.3 stringr_1.2.0 yaml_2.1.16 compiler_3.4.3 memoise_1.1.0
注意:
关于此事的问题已在 Github 上公开:https://github.com/hadley/devtools/issues/1675
当您在包中使用 data.table
时,在描述中导入 data.table 是不够的。 (注意应该是imports
,不是import
)
DESCRIPTION
Imports:
data.table
这只要求您的包用户安装 data.table
包。
您还需要添加这个
NAMESPACE
import(data.table)
一般用来写function
而不是pkg::function
,不建议这样写。但是,您必须为 data.table
执行此操作。
以下是我的解释,但可能并不完全准确。我认为这是因为 data.table 需要为隐式 []
和其他用法分派一些 data.table
特定函数,这不是正常的函数调用,所以您没有使用 data.table::rbindlist
之类的东西,并且因为该对象也是一个 data.frame,调用了基础版本并导致了问题。
是相关问答。
这是一个测试问题,在 github https://github.com/r-lib/testthat/issues/700 上也有人提出过。
一个解决方案是在每个测试文件的开头放置一个 context("some_string")
。
我进行了重大编辑,因为我设法缩小了问题的范围:
我遇到了 devtools::test 的新问题。我的包曾经毫无问题地通过单元测试。但是在更新我的包(包括 devtools 和 testthat)之后它现在失败了。
可重现的例子:
我已经成功构建了一个可重现的示例:在新的包架构中。
foo.R: /R/
中的一个 R 文件foo <- function(obj){
return(as.numeric(obj))
}
test_foo.R: /tests/testthat
中的uniit测试文件test_that("Test my foo function: ",
{
expect_true(is.na(foo("1,5")))
})
testhat.R: 运行 我的单元测试在 /tests/
library(testthat)
library(foo)
test_check("foo")
两种场景
运行: devtools::test()
> devtools::test()
Loading foo
Loading required package: testthat
Testing foo
√ | OK F W S | Context
Error in x[[method]](...) : attempt to apply non-function
== Results =====================================================================
Duration: 0.1 s
OK: 0
Failed: 4
Warnings: 1
Skipped: 0
运行 testtjat::test_dir("tests/")
> testthat::test_dir("tests/")
√ | OK F W S | Context
== testthat results ===========================================================
OK: 2 SKIPPED: 0 FAILED: 0
== Results =====================================================================
Duration: 0.1 s
OK: 0
Failed: 0
Warnings: 0
Skipped: 0
环境
> sessionInfo()
R version 3.4.3 (2017-11-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=French_France.1252 LC_CTYPE=French_France.1252 LC_MONETARY=French_France.1252 LC_NUMERIC=C
[5] LC_TIME=French_France.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] foo_0.0.0.9000 testthat_2.0.0
loaded via a namespace (and not attached):
[1] Rcpp_0.12.15 roxygen2_6.0.1 rprojroot_1.3-2 crayon_1.3.4 assertthat_0.2.0 digest_0.6.14 withr_2.1.1 commonmark_1.4
[9] R6_2.2.2 backports_1.1.2 magrittr_1.5 cli_1.0.0 rlang_0.1.6 stringi_1.1.6 rstudioapi_0.7 xml2_1.1.1
[17] desc_1.1.1 devtools_1.13.4 tools_3.4.3 stringr_1.2.0 yaml_2.1.16 compiler_3.4.3 memoise_1.1.0
注意:
关于此事的问题已在 Github 上公开:https://github.com/hadley/devtools/issues/1675
当您在包中使用 data.table
时,在描述中导入 data.table 是不够的。 (注意应该是imports
,不是import
)
DESCRIPTION
Imports:
data.table
这只要求您的包用户安装 data.table
包。
您还需要添加这个
NAMESPACE
import(data.table)
一般用来写function
而不是pkg::function
,不建议这样写。但是,您必须为 data.table
执行此操作。
以下是我的解释,但可能并不完全准确。我认为这是因为 data.table 需要为隐式 []
和其他用法分派一些 data.table
特定函数,这不是正常的函数调用,所以您没有使用 data.table::rbindlist
之类的东西,并且因为该对象也是一个 data.frame,调用了基础版本并导致了问题。
这是一个测试问题,在 github https://github.com/r-lib/testthat/issues/700 上也有人提出过。
一个解决方案是在每个测试文件的开头放置一个 context("some_string")
。