簡體   English   中英

強制 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函數?

如果需要,這里有一個從這里借來的閃亮的小應用程序。

# 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沒有對代碼本身進行明顯的檢查,因此它可能不會像這樣工作。

查看底層rsconnect:::openURL (使用on.failure參數的地方),我們看到on.failure在兩種情況下使用:

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將具有相同的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM