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

时间:2016-03-31 11:58:53

标签: r testthat

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

我想测试以下内容:

  1. 消息按预期显示(expect_message(fn(),"blah")
  2. 没有错误(expect_error(fn(),NA)
  3. 创建的对象是特定类(expect_is(fn(),"PostgreSQLConnection")
  4. 我可以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")
    

    PS expect_messageexpect_error函数使用throws_error之类的函数,可能会也可能不会弃用 - 文档在这一点上有点混乱。 ?throws_error

2 个答案:

答案 0 :(得分:2)

使用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")

答案 1 :(得分:0)

您还可以链接expect_messageexpect_error

fn1 <- function(){
  message("blah")
  obj<-"blah"
  stop("someError")
}
expect_error(expect_message(fn1()), "someError")
# or
expect_message(expect_error(fn1(), "someError"))