r - 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
需要的文件创建一个帮助文件?还是我必须明确地获取一个通用的帮助文件?
有没有办法我可以在某个地方建立一次连接并让它可用于所有测试并在最后销毁?
解决方案
从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
推荐阅读
- components - 在 Foundation 6 Zurb 堆栈上无法通过 panini 工作的构建块
- javascript - React Native - 未定义不是 StackNavigator 的函数问题
- ios - 在整个项目中快速为字体和控制器添加颜色
- python - 循环遍历文本,一次 3 个字符
- asp.net-core - Npgsql:没有为 CLR 类型“NpgsqlDate”找到到关系类型的映射
- javascript - CSS:溢出:隐藏不能在全屏上工作
- ios - 圆形视图上的不均匀阴影
- react-native - 我需要帮助上传一些东西来展示
- spring-boot - Spring boot 控制器结构(依赖注入问题)
- arangodb - 在 ArangoDB 中使用顶点和边 VS 连接时的性能差异