I'm looking to unit test a function that produces a connection. It outputs a message that contains the connection details during execution.
I want to test the following:
expect_message(fn(),"blah")
)expect_error(fn(),NA)
)expect_is(fn(),"PostgreSQLConnection")
)I could do res<-fn()
and then do the expect_is()
from it, but how can I perform tests on both the message and the (lack of an) error whilst calling the function.
Ideally, I'd like to evaluate all three simultaneously and in such a way I could then safely close the connection afterwards.
library(testthat)
fn<-function(){
message("blah")
obj<-"blah"
class(obj)<-c("PostgreSQLConnection",class(obj))
return(obj)
}
expect_message(fn(),"blah")
expect_error(fn(),NA)
expect_is(fn(),"PostgreSQLConnection")
PS The expect_message
and expect_error
functions use functions like throws_error
which may or may not be deprecated- the docs are a little confusing on that point. ?throws_error
Using testthat::evaluate_promise
you can get the various aspects of a function call, store the results, and then test for the items you need to test.
In this case the code becomes:
library(testthat)
fn<-function(){
message("blah")
obj<-"blah"
class(obj)<-c("PostgreSQLConnection",class(obj))
return(obj)
}
res<-evaluate_promise(fn())
expect_equal(res$messages,"blah")
expect_equal(res$warnings,character())
expect_s3_class(res$result,"PostgreSQLConnection")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With