如何在 R testthat 中同时测试消息和错误消息?
How to test for a message and an error message simultaneously in R testthat?
我希望对生成连接的函数进行单元测试。它在执行期间输出一条包含连接详细信息的消息。
我想测试以下内容:
- 消息按预期显示 (
expect_message(fn(),"blah")
)
- 没有错误(
expect_error(fn(),NA)
)
- 创建的对象是特定的 class (
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")
PS expect_message
和 expect_error
函数使用像 throws_error
这样的函数,这些函数可能会被弃用,也可能不会被弃用——文档在这一点上有点混乱。 ?throws_error
使用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")
您还可以链接 expect_message
和 expect_error
:
fn1 <- function(){
message("blah")
obj<-"blah"
stop("someError")
}
expect_error(expect_message(fn1()), "someError")
# or
expect_message(expect_error(fn1(), "someError"))
我希望对生成连接的函数进行单元测试。它在执行期间输出一条包含连接详细信息的消息。
我想测试以下内容:
- 消息按预期显示 (
expect_message(fn(),"blah")
) - 没有错误(
expect_error(fn(),NA)
) - 创建的对象是特定的 class (
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")
PS expect_message
和 expect_error
函数使用像 throws_error
这样的函数,这些函数可能会被弃用,也可能不会被弃用——文档在这一点上有点混乱。 ?throws_error
使用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")
您还可以链接 expect_message
和 expect_error
:
fn1 <- function(){
message("blah")
obj<-"blah"
stop("someError")
}
expect_error(expect_message(fn1()), "someError")
# or
expect_message(expect_error(fn1(), "someError"))