如何在R中为单元测试建立数据库连接/查询

如何在R中为单元测试建立数据库连接/查询,r,testthat,R,Testthat,我在R项目中使用testthat库进行单元测试。我想测试依赖于数据库查询的代码,但不测试实际查询本身。换句话说,我想模拟数据库连接和查询(让它们返回预先确定的数据集或访问测试数据库) 我知道Ruby中有很多宝石,以及其他语言中的其他等价物,都提供了这种功能。R有类似的吗?或者我应该如何去实现它 一些\u文件.R: sqlQuery <- function(some_query) { chnl <- odbcConnect(get.db.name())

我在R项目中使用
testthat
库进行单元测试。我想测试依赖于数据库查询的代码,但不测试实际查询本身。换句话说,我想模拟数据库连接和查询(让它们返回预先确定的数据集或访问测试数据库)

我知道Ruby中有很多宝石,以及其他语言中的其他等价物,都提供了这种功能。R有类似的吗?或者我应该如何去实现它

一些\u文件.R:

sqlQuery <- function(some_query) {
        chnl <- odbcConnect(get.db.name())
        data <- sqlQuery(chnl, query)
}

sqlQuery只需通过返回模拟结果来模拟
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)
          }
)
库(testthat)

sqlQuery如果您愿意相信SQLite与其他数据库讲的是相同的SQL(大多数情况下是这样),那么您可以模拟本地SQLite数据库并调用它。一个优点是您可以使用类似的工具轻松编辑数据库内容和测试结果

这将是实施的东西的影响

    # SQLite support & init
    library(DBI)
    library(RSQLite)

    putSQLiteHere <- "myRsqlite.sqlite" # could also be ":memory:"
    mySQLiteDB <- dbConnect(RSQLite::SQLite(),putSQLiteHere)

sqlQuery <- function(some_query) {
    data <- dbGetQuery(mySQLiteDB,some_query)
}
#SQLite支持和初始化
图书馆(DBI)
图书馆(RSQLite)
放在这里
    # SQLite support & init
    library(DBI)
    library(RSQLite)

    putSQLiteHere <- "myRsqlite.sqlite" # could also be ":memory:"
    mySQLiteDB <- dbConnect(RSQLite::SQLite(),putSQLiteHere)

sqlQuery <- function(some_query) {
    data <- dbGetQuery(mySQLiteDB,some_query)
}