R:在testthat中进行错误比较的意外行为

时间:2017-11-13 21:32:44

标签: r error-handling testthat

我正在实现一个辅助函数,它根据模板检查提供的参数的长度,并在长度不同时抛出错误。这是功能:

assert_character_vec_length <- function(x, ...) {
  name   <- as.character(substitute(x))
  lens   <- unlist(list(...))
  lnames <- as.character(substitute(list(...)))[-1]
  lnames <- paste(lnames, collapse=' or ')
  if(!(length(x) %in% lens) | !is.character(x))
    stop(paste0('"', name, '"', ' must be a character vector with length ', lnames))
}

以下是其使用示例:

grp <- LETTERS[1:4]
assert_character_vec_length(grp, 3)
  

assert_character_vec_length(grp,3)出错:     &#34; GRP&#34;必须是长度为3的字符向量

我在另一个函数中使用它来检查传递的参数是否正确。我也在使用testthat库编写函数测试。

当我将长度与简单数字进行比较时,一切正常并且测试通过:

x <- matrix(1:100, ncol=10)
grp <- LETTERS[1:4]

err1 <- '"grp" must be a character vector with length 10'
expect_error(assert_character_vec_length(grp, 10), err1)

但令我惊讶的是,当我使用表达式来比较长度时,错误消息并不匹配:

err2 <- '"grp" must be a character vector with length ncol(x)'
expect_error(assert_character_vec_length(grp, ncol(x)), err2)
  

错误:错误$ message不匹配&#34; \&#34; grp \&#34;必须是长度为ncol(x)&#34;的字符向量。   实际值:&#34;&#34; grp&#34;必须是长度为ncol(x)&#34;

的字符向量

我想念的是什么以及这里发生了什么?

1 个答案:

答案 0 :(得分:1)

看看DbContext

SaveChanges

第二个参数名为“regexp”, 事实上, 它被用作正则表达式来测试。

?expect_outputexpect_output(object, regexp = NULL, ..., info = NULL, label = NULL) 在正则表达式中具有特殊含义, 称为捕获组。 如上所述,这些()与错误消息中的文字“(”和“)”字符不匹配。

要使它们与字面括号匹配,您需要转义它们:

(

(实际上,逃离开幕)就足够了。 但是我发现当关闭括号也被转义时,阅读起来就不那么容易了。)