Я testthat
функцию из базы в своем коде, и я хочу издеваться над этой функцией в своем testthat
модуле testthat
.
Как я могу это сделать?
library(testthat)
my.func <- function() {
return(Sys.info()["sysname"]) # e. g. "Linux"
}
my.func()
# sysname
# "Linux"
test_that("base function can be mocked",
with_mock(
Sys.info = function() return(list(sysname = "Clever OS")), # see edit 2 !!!
expect_equal(my.func(), "Clever OS", fixed = TRUE)
)
)
# Error: Test failed: 'base function can be mocked'
# * my.func() not equal to "Clever OS".
?with_mock
говорит:
Функции в базовых пакетах нельзя издеваться, но это можно легко обойти, указав функцию обертки.
Я мог бы инкапсулировать вызов базовой функции Sys.info()
с помощью функции-оболочки, которую я вызываю из my.func
но пусть предполагается, что я не могу этого сделать, потому что я тестирую функцию из пакета, который я не могу изменить...
Любое решение для этого?
Я использую R3.4.4 64 бит на Ubuntu 14.04 с testthat 2.0.0.9000.
Изменить 1:
С помощью
'base::Sys.info' = function() return(list(sysname = "Clever OS"))
приводит к ошибке testthat
msg:
Невозможно высмеять функции в базовых пакетах (базовых)
Редактировать 2: Поскольку @suren показывает в своем ответе, мой пример кода здесь неверен (функция издевательства возвращает другой класс, а затем оригинал :-(
Правильная функция mock должна быть: Sys.info = function() return(c(sysname = "Clever OS"))