如何在R testthat中同时测试消息和错误消息?

Ste*_*cke 5 r testthat

我希望对产生连接的函数进行单元测试。它在执行期间输出一条包含连接详细信息的消息。

我想测试以下内容:

  1. 该消息按预期显示 ( expect_message(fn(),"blah"))
  2. 没有错误 ( expect_error(fn(),NA))
  3. 创建的对象是一个特定的类 ( expect_is(fn(),"PostgreSQLConnection"))

我可以做res<-fn()然后expect_is()从它做,但是如何在调用函数时对消息和(缺少)错误执行测试。

理想情况下,我想同时评估所有三个,然后我可以安全地关闭连接。

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")
Run Code Online (Sandbox Code Playgroud)

PSexpect_messageexpect_error函数使用的函数throws_error可能会或可能不会被弃用 - 文档在这一点上有点混乱。?throws_error

Ste*_*cke 6

使用testthat::evaluate_promise您可以获取函数调用的各个方面,存储结果,然后测试您需要测试的项目。

在这种情况下,代码变为:

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")
Run Code Online (Sandbox Code Playgroud)