Reactive testing for Shiny server functions and modules
Reactive testing for Shiny server functions and modules
A way to test the reactive interactions in Shiny applications. Reactive interactions are defined in the server function of applications and in modules.
app: A server function (i.e. a function with input, output, and session), or a module function (i.e. a function with first argument id that calls moduleServer().
You can also provide an app, a path an app, or anything that as.shiny.appobj() can handle.
expr: Test code containing expectations. The objects from inside the server function environment will be made available in the environment of the test expression (this is done using a data mask with rlang::eval_tidy()). This includes the parameters of the server function (e.g. input, output, and session), along with any other values created inside of the server function.
args: Additional arguments to pass to the module function. If app is a module, and no id argument is provided, one will be generated and supplied automatically.
session: The MockShinySession object to use as the reactive domain . The same session object is used as the domain both during invocation of the server or module under test and during evaluation of expr.
Examples
# Testing a server function ----------------------------------------------server <-function(input, output, session){ x <- reactive(input$a * input$b)}testServer(server,{ session$setInputs(a =2, b =3) stopifnot(x()==6)})# Testing a module --------------------------------------------------------myModuleServer <-function(id, multiplier =2, prefix ="I am "){ moduleServer(id,function(input, output, session){ myreactive <- reactive({ input$x * multiplier
}) output$txt <- renderText({ paste0(prefix, myreactive())})})}testServer(myModuleServer, args = list(multiplier =2),{ session$setInputs(x =1)# You're also free to use third-party# testing packages like testthat:# expect_equal(myreactive(), 2) stopifnot(myreactive()==2) stopifnot(output$txt =="I am 2") session$setInputs(x =2) stopifnot(myreactive()==4) stopifnot(output$txt =="I am 4")# Any additional arguments, below, are passed along to the module.})