【问题标题】:Integration testing on Shiny appsShiny 应用程序的集成测试
【发布时间】:2020-12-13 22:04:46
【问题描述】:

我正在尝试在这个闪亮的应用程序上使用集成测试,但在阅读之后,我不确定我做错了什么。我不断收到此错误: isModuleServer(app) 中的错误:找不到对象“会话” 我也收到此错误:错误:找不到对象“输出”

感谢任何帮助。

library(shiny)
displayColoredBox<- function(color, riskMessage){
  sidebarPanel(style=sprintf("background-color: %s; width: 300px; height: 300px;", color),
               h3(sprintf("%s", riskMessage)) )  }
shinyApp(
  ui = fluidPage(
    
    div(
      id = "form",
      sliderInput("count1", "First Slider Input", value=0, min=0, max=5000),
      sliderInput("count2", "Second Slider Input", value=0, min=0, max=5000),
      uiOutput("coloredBox")
    )),
  
  server <- function(input, output) {
    
    output$coloredBox<-renderUI({
      req(input$count1)
      req(input$count2)
      
      count1 <- input$count1;
      count2 <- input$count2;
      
      likelihood <- (count1*count2)/5000000
      
      
      if (likelihood>1) {
        color="red"
        riskMessage="Extreme risk!"
        
      } else if (likelihood>.65){
        color="orange"
        riskMessage="Very high risk!"
      }
      else if (likelihood>.35){
        color="yellow"
        riskMessage="High risk!"
      }
      else if (likelihood>.10){
        color="blue"
        riskMessage="Moderate risk!"
      } else {
        color="green"
        riskMessage="Low risk!"
      }
      
      displayColoredBox(color, riskMessage)
      
    })
  }
)

testServer({
  session$setInputs(count1 = 1500)
  session$setInputs(count2 = 2500)
  
  stopifnot(output$likelihood == 0.75)
  stopifnot(output$riskMessage == "Very high risk!")
  stopifnot(output$color == "orange")
  
})

【问题讨论】:

    标签: r shiny shiny-server shinyapps shiny-reactivity


    【解决方案1】:

    将您的应用分配给一个对象,该对象必须是testServer 的第一个参数。另外,声明你的 server 函数有一个 session 参数。

    编辑:为了在shinyTest 中使用您的变量,我们使用了reactive,它返回带有您要测试的组件的list

    app <- shinyApp(
      ui = fluidPage(
        
        div(
          id = "form",
          sliderInput("count1", "First Slider Input", value=0, min=0, max=5000),
          sliderInput("count2", "Second Slider Input", value=0, min=0, max=5000),
          uiOutput("coloredBox")
        )),
      
      server <- function(input, output, session) {
        getRiskAndColor<-reactive({
          req(input$count1)
          req(input$count2)
          
          count1 <- input$count1;
          count2 <- input$count2;
          
          likelihood <- (count1*count2)/5000000
          
          
          if (likelihood>1) {
            color="red"
            riskMessage="Extreme risk!"
            
          } else if (likelihood>.65){
            color="orange"
            riskMessage="Very high risk!"
          }
          else if (likelihood>.35){
            color="yellow"
            riskMessage="High risk!"
          }
          else if (likelihood>.10){
            color="blue"
            riskMessage="Moderate risk!"
          } else {
            color="green"
            riskMessage="Low risk!"
          }
          list(color=color, riskMessage=riskMessage, likelihood=likelihood)
        })
        
        output$coloredBox<-renderUI({
          colorRisk<-getRiskAndColor()
          displayColoredBox(colorRisk$color, colorRisk$riskMessage)
          
        })
      }
    )
    

    接下来,我们将testServer 提供给app。请注意,getRiskAndColor 反应值及其组件是可访问的。

    testServer(app, {
      session$setInputs(count1 = 1500)
      session$setInputs(count2 = 2500)
      rc<-getRiskAndColor()
      stopifnot(rc$likelihood == 0.75)
      cat("Correct likelihood value!\n")
      stopifnot(rc$riskMessage == "Very high risk!")
      cat("Correct risk message!\n")
      stopifnot(rc$color == "orange")
      cat("Correct color!\n")
    })
    
    #Correct likelihood value!
    #Correct risk message!
    #Correct color!    
    

    成功了!

    【讨论】:

    • 好的,但是我应该如何检查可能性、风险消息和颜色变量?如果我不检查这些,我应该检查什么?
    • 使它们成为“全局”变量(即直接在server 中定义,而不是在server 内部的函数中)。
    • 我不确定如何将它们设为全局变量,因为我不断收到错误消息。这是我得到的错误:Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)。如果您能够编辑您的回复以便我查看它的外观,我将不胜感激。
    • @user14057357 正确使用变量进行了编辑。
    • 我一直在学习集成测试,但我仍然对一些事情感到有些困惑。这种类型的测试究竟是如何工作的?有虚拟网络浏览器吗?
    最近更新 更多