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

use*_*761 5 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)
 })
Run Code Online (Sandbox Code Playgroud)

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

> test_file("test_message.R")
Cat: Hello world
.
Run Code Online (Sandbox Code Playgroud)

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

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

> f()
Message: Hello world
Cat: Hello world
[1] 1
Run Code Online (Sandbox Code Playgroud)

我知道默认情况下,message()写入stderr和cat写入stdout,我猜测test_file"拦截"stderr来测试警告和错误中的文本.有什么方法可以配置东西,所以我在控制台上看到message()文本?

edd*_*ies 11

这是我在SO上的首次发表的帖子,这是我两周前开始学习的一种语言,所以请保持温和.

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

test_that ("message shows up", {
  expect_message(f(), "^Message: Hello world\\n")
})
Run Code Online (Sandbox Code Playgroud)

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

并且完全归功于GSee for /sf/answers/1713354401/,这是我在考虑同样的问题时出现的第二篇文章.

我刚刚发现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)
})
Run Code Online (Sandbox Code Playgroud)


Gab*_*rdi 5

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

顺便提一句。testthat没有捕捉到标准输出或错误AFAIK,所以如果你写它来cat或者一些其他的方式,这也将显示出来。