如何在shiny::testServer测试中触发依赖reactiveVal的observeEvent?
Shiny模块测试中observeEvent未触发的解决方法
核心原因
在testServer测试环境中,Shiny的响应式调度默认是惰性的:主动调用data()只会计算该响应式变量本身的取值,依赖data()的observeEvent属于副作用类的观察者任务,不会被自动触发执行,需要手动刷新响应式队列。
解决方法
调用测试环境内置的session$flushReact()方法,手动执行所有等待中的响应式副作用任务即可触发observeEvent。
修改后的测试代码如下:
testServer( srv_module, args = list(id = "test", n = reactiveVal(1)), expr = { print(data()) # 手动刷新响应式队列,触发所有观察者 session$flushReact() } )
如果需要测试响应式参数n更新后的触发效果,可以参考如下写法:
testServer( srv_module, args = list(id = "test", n = reactiveVal(1)), expr = { # 首次刷新触发初始值对应的observeEvent session$flushReact() # 修改n的取值 n(3) # 再次刷新触发更新后的observeEvent session$flushReact() } )
补充说明
如果搭配testthat做单元测试,可以直接将刷新逻辑和断言结合,例如:
testthat::expect_message(session$flushReact(), "hi")
可以直接验证observeEvent是否正常触发输出指定消息。
内容的提问来源于stack exchange,提问作者GoGonzo
相关产品推荐
相关产品推荐

