【发布时间】:2015-03-10 13:25:33
【问题描述】:
R 中的包可以对其他包有不同类型的依赖。其中一些类型表示硬要求,即Depends、Imports 和LinkingTo。
但是,还有第二个类别表示更软的依赖关系,即Suggests 和Enhances。在这两种情况下,如果建议的/增强的包可用,包会提供额外的功能。
这是一个具体的例子:包checkpoint 导入knitr 因为knitr 帮助checkpoint 解析rmarkdown 文件。
但现在我正在考虑将 knitr 更改为 Suggests 依赖项,即仅在实际安装了 knitr 时才提供此功能。
为了进行正确的单元测试,这意味着我必须同时测试两种情况:
- 如果
knitr可用,则执行操作。 - 如果
knitr不可用,则发出警告并且什么都不做。
实际的R代码很简单:
if(require(knitr)) {
do_stuff()
} else {
message("blah")
}
问题
但是如何为这两种场景设置单元测试呢?
在我看来,检查require(knitr) 的简单事实将加载knitr 包(如果它在本地库中可用)。
所以,要测试案例 1,我必须在本地安装 knitr,这意味着我无法测试案例 2。
有没有办法为此用例配置testthat(或任何其他单元测试框架)?
【问题讨论】:
-
临时重命名 knitr 文件夹是否可以接受?
-
@Dason 也许,这可能适用于我的本地机器。但是如何在我的持续构建集成机器(Jenkins 或 Travis)上管理这个过程,以及如何编写这个测试以在 CRAN 上工作?
-
我想如果您在这些机器上安装 knitr,它会进入您具有读/写权限的文件夹中。我想它可以归结为通过在
.libPaths()中的条目上使用dir然后使用file.rename将 knitr 文件夹重命名为类似 knitr_BALEETED (或任何你想要的)然后测试完成后将其重命名为 knitr 。我不确定这将如何符合 CRAN... -
这是一个有趣的想法。我会尝试使用
system.file()告诉我位置。老实说,我很乐意禁用 CRAN 上的测试(使用testthat很容易做到),条件是测试在本地和 Travis 上工作。 -
我没有意识到 testthat 可以选择 skip_on_cran。那...实际上使我一直在做的一些事情变得更容易了。