编辑:这不再适用于testthat-2.0.0。根据change in Oct 2017:
- “无法模拟基础包中的函数”:您不能再使用
with_mock() 模拟基础包中的函数,因为由于字节码编译器的更改,这在 R-devel 中不再有效。我建议改用mockery 或mockr。
其余答案仅适用于旧版本的testthat。
testthat::with_mock 应该做你想做的事。
library(testthat)
somefunc <- function() if (requireNamespace("base", quietly=TRUE)) 1L else 2L
一些简单的测试:
expect_equal( somefunc(), 1L )
成功。
expect_equal( somefunc(), 2L )
# Error: somefunc() not equal to 2.
# 1/1 mismatches
# [1] 1 - 2 == -1
预期。
让我们创建一个覆盖基本函数的“模拟”函数:
with_mock(
`base::requireNamespace` = function(package, ..., quietly=FALSE) FALSE,
expect_equal( somefunc(), 1L )
)
# Error: somefunc() not equal to 1.
# 1/1 mismatches
# [1] 2 - 1 == 1
with_mock(
`base::requireNamespace` = function(package, ..., quietly=FALSE) FALSE,
expect_equal( somefunc(), 2L )
)
# [1] 2
注意:成功时,expect_equal 不可见地返回返回值,因此在第一个示例中您看不到[1] 1。 with_mock,成功时返回返回值,但不是不可见的。在这两种情况下,失败都会返回修改后的返回值。这一微小的差异不应影响任何测试。
根据您要覆盖的函数,(对我而言)谨慎定义具有相同形式的模拟函数是有意义的。如果您确切地知道它是如何总是在您的测试期间在所有从属函数中调用的,您也许可以简化此操作,但我认为额外的仔细注意形式将排除真正难以解决的测试失败。
注意:帮助说明这一点
...仍处于试验阶段,因此请谨慎使用。