Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用testthat以未知顺序测试多个警告?_Regex_R_Unit Testing_Testthat - Fatal编程技术网

Regex 如何使用testthat以未知顺序测试多个警告?

Regex 如何使用testthat以未知顺序测试多个警告?,regex,r,unit-testing,testthat,Regex,R,Unit Testing,Testthat,我想测试一个函数是否会在警告顺序可能不同的情况下生成多个警告(4个或更多)。我最好的尝试是基于前瞻性RegExp匹配。通过简化为两个警告,我知道我的RegExp只处理一个字符串输出,因为以下两种情况都是正确的: grepl("(?s)(?=.*2)(?=.*1)", "* warn 1.\n* warn 2.", perl=TRUE) grepl("(?s)(?=.*2)(?=.*1)", "* warn 2.\n* warn 1.", perl=TRUE) 但是,当使用testhat::ex

我想测试一个函数是否会在警告顺序可能不同的情况下生成多个警告(4个或更多)。我最好的尝试是基于前瞻性RegExp匹配。通过简化为两个警告,我知道我的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\u 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.
#生成警告的函数:

foo您可以使用
[12]
如下:

expect_warning( foo(),'(?s)(?=.*[12])' , all=T, perl=TRUE)

因此,我拼凑了一个解决方案,包括使用我自己的警告捕获循环并将警告作为字符串进行检查。这不是一个“一次完成所有任务”的解决方案,但它至少在给定复杂函数调用的情况下是紧凑的。适用于示例函数
foo()
的代码如下:

gotWarnings= character(0)
withCallingHandlers({
   got <- foo()
   }, warning= function(e) {
      # Push warning onto vector in parent frame.
      gotWarnings <<- c(gotWarnings, conditionMessage(e))
      invokeRestart("muffleWarning")
})

# Ensure no unexpected warnings, 
expect_equal(length(gotWarnings), 2)

# Test that each warning I want is there
expect_true( any( grepl( "warn 1\\.", gotWarnings )))
expect_true( any( grepl( "warn 2\\.", gotWarnings )))
gotWarnings=字符(0)
使用呼叫处理程序({

要捕获警告并“手动”分析它们,还可以使用
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", all = FALSE)
expect_match(w, ".*3", all = FALSE)
#生成警告的函数:

foo似乎
expect\u warning
没有
perl
参数(与R中的其他函数一样),但是为什么不简单地使用模式
1.*\\n.*2
1(.*\\n)*.*2
(既然
(?s)
*
和lookahead都是无用的)?@Casimir et Hippolyte-
expect\u warning
接受
,并将参数传递给底层的
grepl
调用,因此它将使用
perl=TRUE
参数。如果没有它,则为“lookahead”包含RegExp是无效的。我需要它,因为顺序未知,并且在我的实际应用程序中有2个以上。lookaheads是一种解决方法。不。与
1 | 2
相同的问题。如果只给出一个警告,例如函数
条是正确的,接受我自己的答案作为解决方案感觉有点奇怪,但它是正确的有一段时间,有人对这个问题投了赞成票。在测试完整的脚本时,我也遇到了类似的问题。我预计会出现一些错误,但我不希望每次测试都执行脚本。是否有方法捕获所有警告,然后对其进行测试?我已经编写了一个