gpt4 book ai didi

r - testthat:设置所有测试可用的数据库连接

转载 作者:行者123 更新时间:2023-12-05 01:15:13 26 4
gpt4 key购买 nike

我的 R 包修改远程数据库中的数据,我想用 testthat 编写一些测试.

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

如何使数据库连接可用于所有需要它的测试,同时确保销毁所有创建的连接?很明显,连接应该发生在 setup 中。并在 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 docs

Code in a setup() block is run immediately in a clean environment

我相信这意味着如果你想保存在 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() 更多地是为读取/写入 tempfiles/tempdirs 而设计的,而不是用于创建供所有测试使用的全局对象,但我可能弄错了。

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

关于r - testthat:设置所有测试可用的数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56474392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com