Reactive testing for Shiny server functions and modules — testServer
R/test-server.R
Description
A way to test the reactive interactions in Shiny applications. Reactive interactions are defined in the server function of applications and in modules.
Arguments
- app
A server function (i.e. a function with
input
,output
, andsession
), or a module function (i.e. a function with first argumentid
that callsmoduleServer()
.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
, andsession
), 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 noid
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 ofexpr
.
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.
})