强制 rsconnect::deployApp() 无法测试 'on.failure'

Force rsconnect::deployApp() to fail to test 'on.failure'

我有一个 shiny 应用程序,它使用批处理文件和计划任务通过 rsconnect::deployApp 每晚更新。此过程目前正在按预期运行,但目前确认整个过程是否成功的唯一方法是访问应用程序并检查时间戳是否已更新。

?deployApp 显示了一个 on.failure 选项,如果部署失败,该选项将调用一个函数。如果部署失败,我有关于如何使用它发送通知的想法,但我无法对其进行测试,因为我实际上无法使 deployApp 函数失败。

我已尝试在 UI 中放置错误,但应用程序成功部署,尽管在查看器和 shinyapps.io 上无法正常运行。

有没有办法强制 deployApp 函数失败,以便我能够测试我正在创建的 on.failure 函数?

如果需要,这里有一个从 here 借来的闪亮的小应用程序。

# Global variables can go here
n <- 200


# Define the UI
ui <- bootstrapPage(
  numericInput('n', 'Number of obs', n),
  plotOutput('plot')
)


# Define the server code
server <- function(input, output) {
  output$plot <- renderPlot({
    hist(runif(input$n))
  })
}

# Return a Shiny app object
shinyApp(ui = ui, server = server)

目前 运行 R v. 4.0.2; rsconnect 0.8.16,闪亮的 1.5.0

编辑:我试着在应用程序中偷偷 q()。它肯定会破坏应用程序,但不会干扰 deployApp。搜索继续!

我的猜测是 on.failure 会在部署出错时触发。从这个角度来看,代码中的错误(stop 甚至 q)只有在篡改 部署 时才会触发 on.failure。由于在 deployApp 中没有对 code 本身进行明显的检查,因此它可能不会像这样工作。

查看基础 rsconnect:::openURL(使用 on.failure 参数的地方),我们看到 on.failure 在 2 个条件下使用:

if (!is.null(client$configureApplication)) {
    config <- client$configureApplication(application$id)
    url <- config$config_url
    if (!deploymentSucceeded && validURL(config$logs_url)) {
        url <- config$logs_url
    }
    if (validURL(url)) {
        if (deploymentSucceeded) {
            showURL(url)
        }
        else if (is.function(on.failure)) {
            on.failure(url) ## here
        }
    }
}
else if (deploymentSucceeded) {
    showURL(application$url)
}
else if (is.function(on.failure)) {
    on.failure(NULL) ## and here
}

所以我要做的测试是 debug(rsconnect:::openURL),当浏览器打开时,我会简单地设置 client$configureApplication <- NULL;deploymentSucceeded <- FALSE 并继续代码。

但是,查看代码,我们看到所有将要发生的事情是 on.failure 被调用。所以直接调用on.failure也是一样的效果。