【发布时间】:2022-01-06 09:30:41
【问题描述】:
我想运行所有测试并获取测试结果并生成警告,以编程方式创建一个降价报告,显示测试结果和测试代码中出现的潜在警告。
但在测试运行期间似乎无法获取或捕获警告!我知道测试是在封闭的环境中执行的,但是真的没有办法让 testthat 向我提供抛出的警告吗?
在以下设置中,warn_list 变量始终为空。
最小示例的三个文件:
./tests/testthat.R
library(testthat)
warn_list <- list()
outcome <- withCallingHandlers(
testthat::test_dir(testthat::test_path()),
warning = function(w) {
warn_list <<- c(warn_list, list(msg = w$message))
}
)
rmarkdown::render(input = './tests/create_test_report.Rmd')
请注意,Rmd 文件中使用了outcome(和warn_list)变量。
./tests/testthat/test_thrown_warn.R
test_that("Throws Warning", {
testthat::expect_equal(
{
warning('Example warning fired inside test!') # WHERE WARN IS THROWN
5
}, 5)
})
./tests/create_test_report.Rmd
---
title: "test_results_overview"
output: md_document
---
## Produced warnings during the tests:
```{r warnings_during_testing, echo=FALSE}
knitr::kable(warn_list) # WHERE I TRY TO SHOW IT
```
【问题讨论】:
-
我怀疑
testthat正在捕捉警告。也许将reporter参数设置为非默认(或自定义)的参数会得到你想要的。 -
说得好,我读到了不同的(相当无证的)记者,但没有对它们进行试验。如果我没记错的话,测试返回的 testthat_results 类对象仍然保持不变......?会看看
-
如果您对答案有疑问:如果您只想要警告(或跳过或失败)本身,请选择“user2554330”他的答案。如果您喜欢它发生的行以及更多上下文(例如文件/测试/上下文等),请选择我的答案。
-
实际上,我的回答中提到的
awarning对象不仅仅是一个条件对象。awarning$test会给出测试的名称,位置可以从awarning$srcref组件中找到。