20

expect_error()in testthatpackage的正确用法是什么?我试图从帮助中调整示例,但是当我在错误消息中使用括号时失败。

library(testthat)

# Works
tmp1 <- function() stop("Input is not correct")
    expect_error(tmp1(),"Input is not correct")

# Does not work
tmp2 <- function() stop("Input (x) is not correct")
    expect_error(tmp2(),"Input (x) is not correct")

# Does not work
tmp3 <- function() stop("Input(")
    expect_error(tmp3(),"Input(")

这导致:

> library(testthat)
> 
> # Works
> tmp1 <- function() stop("Input is not correct")
> expect_error(tmp1(),"Input is not correct")
> # Does not work
> tmp2 <- function() stop("Input (x) is not correct")
> expect_error(tmp2(),"Input (x) is not correct")
Error: tmp2() does not match 'Input (x) is not correct'. Actual value: 
Error in tmp2() : Input (x) is not correct
> # Does not work
> tmp3 <- function() stop("Input(")
> expect_error(tmp3(),"Input(")
Error in grepl("Input(", "Error in tmp3() : Input(\n", fixed = FALSE,  : 
  invalid regular expression 'Input(', reason 'Missing ')''

R 版本 3.0.1 (2013-05-16)

4

2 回答 2

26

从 0.8 版(2014-02-20 发布)开始,您可以将参数传递给grep. 允许fixed = TRUE在调用中使用,因此字符串不被视为正则表达式,而是字面意思。

所以你可以使用:

# Works
tmp1 <- function() stop("Input is not correct")
expect_error(tmp1(), "Input is not correct", fixed=TRUE)

# Works
tmp2 <- function() stop("Input (x) is not correct")
expect_error(tmp2(), "Input (x) is not correct", fixed=TRUE)

# Works
tmp3 <- function() stop("Input(")
expect_error(tmp3(), "Input(", fixed=TRUE)
于 2015-05-05T21:02:28.387 回答
10

第二个参数是一个正则表达式。所以你应该给出一个有效的正则表达式,例如,这将适用于 3 个函数:

## this works for 3 , error message containing Input
lapply(list('tmp1','tmp2','tmp3'),function(x){
   expect_error(do.call(x,list()),"Input.*")
})

## this works for 3 also, but more complicated regular expression
lapply(list('tmp1','tmp2','tmp3'),function(x){
  expect_error(do.call(x,list()),"Input.?\\(?")
})
于 2013-07-11T10:19:10.300 回答