gpt4 book ai didi

r - 在 testthat 中测试确切的字符串

转载 作者:行者123 更新时间:2023-12-05 09:22:53 26 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

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

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

需要 \\n 来匹配 message 添加的新行。

对于警告,它稍微简单一些,因为没有换行符:

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

对于错误,它有点难:

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

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


或者,借用 Mr. Flick 的回答 here ,您可以将消息转换为字符串,然后使用 expect_trueexpect_identical

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

关于r - 在 testthat 中测试确切的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24474754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com