7

我在 R 中使用了出色的 testthat 包。我的问题是,在使用 test_file 时,我在正在测试的代码中看不到 message() 函数的任何输出。例如,假设我在名为 test_message.R 的文件中有以下代码

f <- function() {
    message ("Message: Hello world")
    cat ("Cat: Hello world\n")
    return (1)
}

test_that ("message shows up", {
     expect_equal(f(), 1)
 })

我按如下方式运行 test_file 并得到下面的输出

> test_file("test_message.R")
Cat: Hello world
.

所以我没有看到来自 message() 的文本。

但是,当我自己运行代码时,我确实看到了它:

> f()
Message: Hello world
Cat: Hello world
[1] 1

我知道默认情况下,message() 写入 stderr,而 cat 写入 stdout,我猜测 test_file “拦截”stderr 以测试警告和错误中的文本。有什么方法可以让我在控制台上看到 message() 文本?

4

2 回答 2

13

这是我在 SO 上的就职帖子,关于我两周前刚开始学习的一门语言,所以要温柔。

我相信以下是您正在寻找的内容:

test_that ("message shows up", {
  expect_message(f(), "^Message: Hello world\\n")
})

此外,请参阅testthat.pdf第 23 页的shows_message&文档(供将来参考:v0.8.1 于 2014-02-22 00:25:04 发布)。expect_message

并完全归功于 GSee 的https://stackoverflow.com/a/24476491/3811916,这是我在寻找测试相同问题时出现的第二个帖子。

我刚刚发现evaluate_promise(也在上面链接的pdf中)。所以这里有一个替代方法,可以测试消息并打印输出:

test_that ("message shows up", {
  result <- evaluate_promise(f(), print = TRUE)
  expect_that(result$message, equals("Message: Hello world\n"))
  print(result$output)
})
于 2014-07-23T12:40:19.793 回答
5

你不能这样做,至少在不修改testthat. 这是运行测试代码的部分:https://github.com/hadley/testthat/blob/0af22cfc7c7f6b13b02537f0d37d96d72d8a98b7/R/test-that.r#L65如果suppressMessagestest_code函数中删除 ,那么消息将是显示。

顺便提一句。testthat不捕获标准输出或错误AFAIK,因此如果您使用或其他方式写入它cat,也会显示。

于 2014-07-16T00:32:57.823 回答