首页 > 解决方案 > testthat:设置可用于所有测试的数据库连接

问题描述

我的 R 包修改了远程数据库中的数据,我想用testthat.

我知道我可以模拟数据库,但我宁愿简单地使用我们的开发数据库。

如何使数据库连接可用于所有需要它的测试,同时确保创建的任何连接都被破坏?似乎很明显,连接应该发生在 asetup中,而断开连接应该发生在 a 中teardown,但我没有做到。

我试图将以下代码放入tests/testthat.R或放入帮助文件tests/testthat/helper-_中,但无济于事。

setup({
  # db_connect is just a basic wrapper around RMariaDB::dbConnect with logging
  db_con <- db_connect(conf$database, loglevel = "none")
})

teardown({
  # db_connect is just a basic wrapper around DBI::dbDisconnect with logging
  db_disconnect(db_con = db_con, loglevel = "none")
})

我最初的测试是:

tests
├── testthat
│   ├── helper-_.R
│   ├── test-connect.R
│   └── test-questions.R
└── testthat.R

在第一个文件(所有测试都通过)之后,我得到Error in DBI::dbDisconnect(db_con) : object 'db_con' not found这表明正在发生拆解db_con但未找到。

之后,所有需要db_con失败的测试都以object 'db_con' not found.

我是否必须为每个db_con需要的文件创建一个帮助文件?还是我必须明确地获取一个通用的帮助文件?

有没有办法我可以在某个地方建立一次连接并让它可用于所有测试并在最后销毁?

标签: rdatabase-connectiontestthat

解决方案


testthat 文档

块中的代码setup()立即在干净的环境中运行

我相信这意味着如果您想保存在您的setup环境中创建的任何对象,那么您需要将它们放置在全局环境中

setup({
  db_con <- db_connect(conf$database, loglevel = "none")
  assign("db_con", db_con, envir = .GlobalEnv)
})

然后在您的teardown()方法中,它将能够找到连接

teardown({
  db_disconnect(db_con = db_con, loglevel = "none")
  # Can also remove it from the global environment after disconnect
  rm(db_con, envir = .GlobalEnv)
})

搞乱全局环境并不理想,但只要你仔细命名并在完成后将其删除,这应该不是问题。

似乎setup()是为读取/写入临时文件/临时目录而设计的,而不是为创建供所有测试使用的全局对象而设计的,但我可能弄错了。

我在研究这个问题时遇到的有用的例子:https ://github.com/ropensci/Rpolyhedra/blob/3675a3a6eb8b2807f26fb2ebc929b9f5072681db/tests/testthat/test_package_lib.R#L7


推荐阅读