测试将数据写入磁盘的包函数

7
我正在尝试为R中的一个包函数编写测试。
假设我们有一个简单的函数,它使用`writeLines()`将一个字符串`x`写入磁盘:
exporting_function <- function(x, file) {

 writeLines(x, con = file)

 invisible(NULL)
}

一种测试方法是检查文件是否存在。通常,在导出功能运行之前,它不应该存在,但在运行后应该存在。另外,您可能还想测试文件大小是否大于0:
library(testthat)

test_that("file is written to disk", {
 file = 'output.txt'
 expect_false(file.exists(file))

 exporting_function("This is a test",
                    file = file)


 expect_true(file.exists(file))

 expect_gt(file.info('output.txt')$size, 0)
})

这是测试它的好方法吗?在CRAN存储库政策中指出,“软件包不应编写用户的主文件空间(包括剪贴板)或文件系统上除R会话临时目录之外的任何位置”。这个测试是否违反了这个限制?
有一个expect_output_file函数。从文档和示例中,我不确定这是否是更适合测试该函数的期望。它需要一个“对象”参数,应该是“要测试的对象”。在我的情况下,要测试的对象是什么?

2
该政策还指出,“如果包从用户那里获得确认,交互会话可能允许有限的例外。”我必须假设这包括隐含的确认,例如使用其显式目的是将数据写入磁盘的函数;否则,像 devtools, RcppRcppArmadillo 这样为用户设置 R 包目录结构的包将永远无法在 CRAN 上。 - duckmayr
1
你问题中关于如何测试函数的部分非常适合在Stack Overflow上提问。而关于CRAN政策的部分可能更适合R-package-devel邮件列表 - duckmayr
很好,还可以在问题中添加:如何正确地向写入文件的函数添加示例。 - vlad1490
1
可以使用 \dontrun{} 来实现。 - clemens
1个回答

4

看起来好像违反了CRAN政策。为什么不直接写入临时目录,使用

file <-  tempfile()

取代
file = 'output.txt'

关于这是否是一个好的测试:是否尝试重新读取文件并确认所读内容与所写内容匹配会更好?在您的玩具示例中很容易做到。在真实环境中可能会更难,但与您的导出函数配对使用导入函数始终是个好主意。


好的,实际文件将是PNG、JPEG或PDF格式,这使得测试变得更加困难。 - clemens
3
你还需要在之后清理临时文件,并避免测试失败导致清理停止。我曾在一个 CRAN 软件包中遇到过这个问题,而 CRAN 不喜欢这样做。 - Jack Wasey
1
@JackWasey 看起来 on.exit(unlink(file)) 可以满足这个要求。 - merv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接