首页 > 解决方案 > 使用锁定命名空间的 R 模拟测试

问题描述

我正在努力在 R 中创建一些单元测试,我需要模拟一些函数,比如RCurl::getURL它们返回预设输出并且不需要网络连接。

这是一个例子:

library(mockthat)

test_that("API works", {

  mock_response <- mockthat::mock('[{"foo":7}]')

  mockthat::with_mock(
    getURL=mock_response,
    {
      result <- myFunction()
    })

  ...

这失败并出现以下错误,但仅当我在devtools::check()orR CMD check下运行时(它在 下成功devtools::test()):

not ok 1 API works
  Error: cannot change value of locked binding for 'getURL'
  Backtrace:
   1. mockthat::with_mock(...) test-yes.R:29:2
   2. base::lapply(mocks, set_mock)
   3. mockthat:::FUN(X[[i]], ...)
   4. mockthat:::do_assign(mock$name, mock$new_value, mock$env)
   5. base::assign(name, val, envir = env)

有什么我可以改变的,或者我可以使用的解决方法吗?

我在用着:

> packageVersion('mockthat')
[1] '0.2.6'

> cat(head(capture.output(sessionInfo()), 3), sep="\n")
R version 4.1.1 (2021-08-10)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur 11.4

但问题似乎也存在于testthat's mocking 的东西下(现在已被弃用,所以我不想使用它)也是mockery如此。

为没有创建正确的道歉reprex- 我不确定如何在没有整个包结构的情况下演示问题。

[改编自 https://github.com/nbenn/mockthat/issues/6 上报告的问题]

标签: rmockingnamespaces

解决方案


推荐阅读