使用 {testthat} 在测试中隐藏 {cli} 消息

Hide {cli} messages in tests with {testthat}

我在我的一个包裹中使用 {cli} 消息。我想在我的测试中隐藏这些消息,因为它们会使测试结果混乱。有办法吗?

我看到 {cli} 有一个 TESTTHAT 环境变量,但我不知道它是否为此目的而存在,我也不知道如何使用它。请注意,我更喜欢易于实施的解决方案,例如测试全局选项。我不想手动编辑我所有的测试或消息。

可重现的例子:

library(testthat)
library(cli)

test_that("addition works", {
  cli_alert_info("This message should not appear")
  expect_equal(1+1, 2)
})

#> i This message should not appear
#> Test passed 

编辑: 我可以创建一个自定义 test_that() 来包装 suppressMessages(),如下所示:

my_test_that <- function(desc, code) {
  test_that(desc, {
    suppressMessages({
      code
    })
  })
}

my_test_that("addition works", {
  cli_alert_danger("This message should not appear")
  expect_equal(1+1, 2)
})

#> Test passed 

然后存入tests/testthat/setup.R。问题是,如果测试失败,它指示 my_test_that() 中的行,而不是实际出现错误的行(因此基本上所有错误和警告都将引用同一行):

my_test_that("addition works", {
  cli_alert_danger("This message should not appear")
  expect_equal(1+4, 2)
})

-- Failure (.active-rstudio-document:6:5): addition works ----------------------
1 + 4 (`actual`) not equal to 2 (`expected`).

这里错误指的是suppressMessages()这一行。这使得查找问题的根源变得更加困难。

this Github issue中给出了一个解决方案。将 withr::with_options()withr::local_options()option cli.default_handler = function(...) { } 一起使用似乎有效。

library(testthat)
library(cli)

my_test_that <- function(desc, code) {
  withr::with_options(
    list(
      cli.default_handler = function(...) { },
      usethis.quiet = TRUE
    ),
    test_that(desc, {
      code
    })
  )
}

my_test_that("addition works", {
  cli_alert_danger("This message should not appear")
  expect_equal(1+2, 2)
})

-- Failure (.active-rstudio-document:15:3): addition works ---------------------
1 + 2 not equal to 2.
1/1 mismatches
[1] 3 - 2 == 1

请注意,这将删除所有 cli 消息,因此无法在 my_test_that() 中使用 expect_message()