Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use testthat expect_error() correctly?

Tags:

What is the correct usage of expect_error() in testthat package? I've tried to adapt example from help, but this fails when I use brackets in error message.

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(")

This results in:

> 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 version 3.0.1 (2013-05-16)

like image 453
Tomas Greif Avatar asked Jul 11 '13 09:07

Tomas Greif


People also ask

How do I run a Testthat test?

The easiest way to get started is with usethis. Assuming you're in a package directory, just run usethis::use_test("name") to create a test file, and set up all the other infrastructure you need. If you're using RStudio, press Cmd/Ctrl + Shift + T (or run devtools::test() if not) to run all the tests in a package.

What is Testthat in R?

'testthat' is a testing framework for R that is easy to learn and use, and integrates with your existing 'workflow'. License MIT + file LICENSE. URL https://testthat.r-lib.org, https://github.com/r-lib/testthat.


2 Answers

Since version 0.8 (released 2014-02-20) you could pass arguments to grep. That allow to use fixed = TRUE in call so string is not treated as regular expression but literally.

So you could use:

# 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)
like image 174
Marek Avatar answered Oct 01 '22 10:10

Marek


The second argument is a a regular expression. So you should give a valid regular expression, For example , this will work for 3 functions :

## 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.?\\(?")
})
like image 44
agstudy Avatar answered Oct 01 '22 09:10

agstudy