A way to test the reactive interactions in Shiny applications. Reactive interactions are defined in the server function of applications and in modules.
testServer(app = NULL, expr, args = list(), session = MockShinySession$new())
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.
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.
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.
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
.
# 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)
})
#> The value of x is 30
# 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.
})