加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 如何使用testthat测试未知顺序中的多个警告?

发布时间:2020-12-14 05:49:23 所属栏目:百科 来源:网络整理
导读:我想测试一个函数生成多个警告(4个或更多),当警告的顺序可能会有所不同时.我最好的尝试是基于前瞻RegExp匹配.简化为2个警告,我知道我的RegExp在单个字符串输出上工作,因为以下两个都是真的: grepl("(?s)(?=.*2)(?=.*1)","* warn 1.n* warn 2.",perl=TRUE)g
我想测试一个函数生成多个警告(4个或更多),当警告的顺序可能会有所不同时.我最好的尝试是基于前瞻RegExp匹配.简化为2个警告,我知道我的RegExp在单个字符串输出上工作,因为以下两个都是真的:

grepl("(?s)(?=.*2)(?=.*1)","* warn 1.n* warn 2.",perl=TRUE)
grepl("(?s)(?=.*2)(?=.*1)","* warn 2.n* warn 1.",perl=TRUE)

但是,使用testhat :: expect_warning测试多个警告时,这不起作用

# The function generating warnings:
foo <- function() { warning("warn 1."); warning("warn 2.") }
foo()
Warning messages:
1: In foo() : warn 1.
2: In foo() : warn 2.

# Testing it
expect_warning( foo(),"(?s)(?=.*1)(?=.*2)",perl=TRUE)

Error: foo() does not match '(?s)(?=.*1)(?=.*2)'. Actual values:
* warn 1.
* warn 2.

我怀疑这是因为expect_warning的内部正在执行类似于针对每个警告分别测试给定的RegExp的原因 – 为什么expect_warning(… all = TRUE)参数可能有意义.

不幸的是,我无法使用像“1 | 2”这样的RegExp;如果只给出一个警告,则成功.

我还想避免多次运行该函数并每次测试不同的警告.测试实际功能需要大量的设置和拆卸代码.它与文件系统进行了大量的交互,因为它是我正在测试的文件系统警告,我无法嘲笑它.此外,我想在多种情况下测试警告,每种情况都需要不同的设置和拆卸代码,因此这很快就会使我的测试失败.

关于如何简单地一次性测试多个警告的任何建议?

解决方法

要捕获警告并“手动”分析它们,您还可以使用testthat :: capture_warnings:

# The function generating warnings:
foo <- function() { warning("warn 1."); warning("warn 2.") }

w <- capture_warnings(foo())
expect_match(w,".*1",all = FALSE)
expect_match(w,".*2",".*3",all = FALSE)

(最后一行引发错误.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读