使用check()函数时出现testthat测试失败问题

5
我正在尝试为我的程序添加一些测试,以确保在进行更改时事物保持不变。但是我在这方面遇到了一些困难。
我想测试我的程序的主要功能,大致描述为一种插补方法。因此,如果我给它一个 n x 2 矩阵 Y,其中第二列有一些 NA,它应该返回 Z,其中 YZ 的第一列相同(因为它完全被观察到),并且第二列应该被插补,以便 Z 的第二列中没有 NA
显然,该函数还有其他几个输入,但是我的测试的主要结构是:
context("Test output")
test_that("First column equal", {
  set.seed(100)
  Y <- matrix(rnorm(200), 100, 2)
  Y[seq(1, 100, by = 3), 2] <- NA
  out <- my_fun(Y)
  expect_equal(Y[, 1], out[, 1])
})

我的问题是这个无法正常工作。当我运行devtools::test()时可以工作,但运行devtools::check()时就不行了。我尝试使用expect_equal_to_reference()(因为我要测试的内容比这个例子更大、更复杂),但它也会抛出错误,即使在控制台中运行代码并将其与保存的.rds文件进行比较后发现它们是相同的。

我发现Hadley在(检查)中说过这样一句话:

有时您可能会遇到一个问题,在使用devtools::test()交互式运行测试时,测试通过,但在使用R CMD check时失败。这通常表示您对测试环境做出了错误的假设,而且往往很难找到问题所在。

这情况看起来不太妙,但我该怎么办?有什么想法吗?

这是我得到的错误消息(test_file是包含上述代码的文件名):

checking tests ...
** running tests for arch 'i386' ... ERROR
Running the tests in 'tests/testthat.R' failed.
Last 13 lines of output:
  3: asNamespace(ns)
  4: getNamespace(ns)
  5: tryCatch(loadNamespace(name), error = function(e) stop(e))
  6: tryCatchList(expr, classes, parentenv, handlers)
  7: tryCatchOne(expr, names, parentenv, handlers[[1L]])
  8: value[[3L]](cond)
... 13 lines ...
  5: tryCatch(loadNamespace(name), error = function(e) stop(e))
  6: tryCatchList(expr, classes, parentenv, handlers)
  7: tryCatchOne(expr, names, parentenv, handlers[[1L]])
  8: value[[3L]](cond)

  testthat results ================================================================
  OK: 0 SKIPPED: 0 FAILED: 1
  1. Error: First column equal (@test_file.R#12) 

尝试调试简化的 my_fun() 可能会有帮助(但仍然无法通过测试)。 - m-dz
@m-dz 我明白这一点,但是该函数相当复杂,整个包(或多或少)只是它的构建块。我知道在没有它的情况下提问是很冒险的,但我希望有人之前经历过类似的事情。 - hejseb
也许可以尝试(在 https://github.com/hadley/testthat/issues/86 之后):在 tests/testthat.R 的第一行添加 Sys.setenv("R_TESTS" = "") - m-dz
1
@m-dz,我感到几乎羞愧,但我刚忘了在测试文件中也加载包。我在考虑删除这个问题,但是为了以防其他人将来犯同样的错误,我会让它留下来。 - hejseb
1个回答

3
答案既尴尬又简单。测试文件需要加载该软件包,因此应以以下方式开始:
library(mypackage)
context("Test output")

虽然之前我认为它可行,但实际上并不是。现在包已正确加载,例如由my_fun打印的进度条将出现在“Build”面板中。


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