在 testthat 中测试确切的字符串

2024-03-01

我想测试我的函数之一是否给出特定消息(或警告或错误)。

good <- function() message("Hello")
bad <- function() message("Hello!!!!!")

我希望第一个期望成功,第二个期望失败。

library(testthat)
expect_message(good(), "Hello", fixed=TRUE)
expect_message(bad(), "Hello", fixed=TRUE)

不幸的是,他们俩现在都过去了。

澄清一下:这只是一个最小的示例,而不是我正在测试的确切消息。如果可能的话,我希望避免为我的测试脚本增加复杂性(可能还有错误),因为需要为我想要测试的每条新消息提供适当的正则表达式。


您可以使用^ and $锚点以指示字符串必须以您的模式开始和结束。

expect_message(good(), "^Hello\\n$")
expect_message(bad(), "^Hello\\n$")
#Error: bad() does not match '^Hello\n$'. Actual value: "Hello!!!!!\n"

The \\n需要匹配新行message adds.

对于警告来说,它更简单一些,因为没有换行符:

expect_warning(warning("Hello"), "^Hello$")

对于错误来说有点困难:

good_stop <- function() stop("Hello")
expect_error(good_stop(), "^Error in good_stop\\(\\) : Hello\n$")

请注意任何正则表达式元字符,即. \ | ( ) [ { ^ $ * + ?,需要转义。


或者,借用弗里克先生的答案here https://stackoverflow.com/a/24397137/967840,您可以将消息转换为字符串,然后使用expect_true, expect_identical, etc.

messageToText <- function(expr) {
  con <- textConnection("messages", "w")
  sink(con, type="message")
  eval(expr)
  sink(NULL, type="message")
  close(con)
  messages
}

expect_identical(messageToText(good()), "Hello")
expect_identical(messageToText(bad()), "Hello") 
#Error: messageToText(bad()) is not identical to "Hello". Differences: 1 string mismatch
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 testthat 中测试确切的字符串 的相关文章

随机推荐