如何在golem应用中正确使用shinytest2进行测试?
在Golem应用中正确使用shinytest2的解决方案
一、解决原始目录结构与函数找不到的问题
不要在项目根目录创建app.R——这会让shinytest2将项目识别为普通Shiny应用而非R包,进而引发加载冲突。正确操作步骤:
- 将
shinytest2添加到DESCRIPTION的Suggests字段:usethis::use_package("shinytest2", type = "Suggests") - 初始化shinytest2测试结构:
该命令会自动创建shinytest2::use_shinytest2()tests/testthat/shinytest2目录及必要配置文件。 - 始终在包加载状态下操作:
执行devtools::load_all()加载Golem包完整命名空间,确保with_golem_options等核心函数可被正常调用。
二、解决录制测试时Golem配置参数未传递的问题
出现的数据库连接失败,根源是录制测试时golem::get_golem_options()无法获取传入的配置值,可通过以下两种方式解决:
方式1:录制时显式传递参数给run_app
调用record_test前,直接将所需参数传入run_app,确保Golem选项被正确初始化:
# 先加载Golem包 devtools::load_all() # 显式传递数据库配置参数(可直接传值,或确保当前会话能读取环境变量) shiny_app <- run_app( db_server = Sys.getenv("MY_DB_SERVER"), db_name = Sys.getenv("MY_DB_NAME"), uid = Sys.getenv("MY_DB_UID"), pwd = Sys.getenv("MY_DB_PWD") ) # 启动测试录制 shinytest2::record_test(shiny_app, name = "ShinyGolem")
方式2:在测试文件中预设Golem选项
若需在测试中复用配置,可在测试文件开头预先设置Golem选项,再启动应用:
# tests/testthat/shinytest2/ShinyGolem.R test_that("ShinyGolem app functions correctly", { # 预设Golem配置选项 golem::set_golem_options( db_server = Sys.getenv("MY_DB_SERVER"), db_name = Sys.getenv("MY_DB_NAME"), uid = Sys.getenv("MY_DB_UID"), pwd = Sys.getenv("MY_DB_PWD") ) # 初始化应用驱动 app <- shinytest2::AppDriver$new(app_dir = here::here(), app_args = list()) # 后续测试步骤示例 app$expect_values() })
关键注意事项
- 确保录制/测试的R会话能正确读取所需环境变量:可通过
Sys.setenv()在会话中临时设置,或通过项目根目录的.Renviron文件持久化配置。 - 显式传递参数能避免环境不一致导致的配置丢失问题,不要依赖
run_app自动读取环境变量。 - 修改Golem配置后,需重新执行
devtools::load_all()或devtools::install(),确保最新代码被加载。
内容的提问来源于stack exchange,提问作者W_vH
相关产品推荐
相关产品推荐

