R testthat包:如何在使用test_file()时看到message()的输出

时间:2014-07-15 20:47:10

标签: r testthat

我在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()文本?

2 个答案:

答案 0 :(得分:11)

这是我在SO上的就职帖子,这是我两周前开始学习的一种语言,所以请保持温和。

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

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

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

https://stackoverflow.com/a/24476491/3811916的GSee充分肯定,这是我在考试同样问题时出现的第二篇文章。

我刚刚发现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)
})

答案 1 :(得分:4)

你不能这样做,至少在没有修改testthat源代码的情况下也是如此。这是运行测试代码的部分:https://github.com/hadley/testthat/blob/0af22cfc7c7f6b13b02537f0d37d96d72d8a98b7/R/test-that.r#L65如果从suppressMessages函数中删除test_code,则会显示消息。

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