我在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()文本?
答案 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
或其他方式写入,也会显示。