我正在尝试为我的程序添加一些测试,以确保在进行更改时事物保持不变。但是我在这方面遇到了一些困难。
我想测试我的程序的主要功能,大致描述为一种插补方法。因此,如果我给它一个
显然,该函数还有其他几个输入,但是我的测试的主要结构是:
我的问题是这个无法正常工作。当我运行
我想测试我的程序的主要功能,大致描述为一种插补方法。因此,如果我给它一个
n x 2
矩阵 Y
,其中第二列有一些 NA
,它应该返回 Z
,其中 Y
和 Z
的第一列相同(因为它完全被观察到),并且第二列应该被插补,以便 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-dztests/testthat.R
的第一行添加Sys.setenv("R_TESTS" = "")
。 - m-dz