我正在使用该testthat库在R项目中进行单元测试.我想测试依赖于数据库查询的代码,但不测试实际的查询本身.换句话说,我想模拟数据库连接和查询(让它们返回预定的数据集或命中测试数据库).
我知道Ruby中有很多宝石,以及其他语言中的其他宝石,它们提供了这种功能.R有什么类似的吗?或者我该如何完成它?
some_file.R:
sqlQuery <- function(some_query) {
chnl <- odbcConnect(get.db.name())
data <- sqlQuery(chnl, query)
}
Run Code Online (Sandbox Code Playgroud)
从测试文件:
test_that("test query", {
dataset <- sqlQuery("SELECT * FROM some_database_table")
#How to make this not actually hit the production database?
expect_equal(nrow(dataset), 2)
} )
Run Code Online (Sandbox Code Playgroud)
如果没有方便的包,testthat::with_mock()我最好的选择?
只需sqlQuery通过返回模拟结果来模拟该函数:
library(testthat)
sqlQuery <- function(some_query) {
chnl <- odbcConnect(get.db.name())
data <- sqlQuery(chnl, query)
}
with_mock(sqlQuery = function(some_query) {
if (grepl("SELECT * FROM some_database_table", some_query, fixed = TRUE))
return(mtcars[1:2,]) # could also be loaded from file via "load" after using "save" once
return(mtcars) # default return value
},
{
# Calls the mocked function now...
dataset <- sqlQuery("SELECT * FROM some_database_table")
expect_equal(nrow(dataset), 2)
}
)
Run Code Online (Sandbox Code Playgroud)