Hello,
I have a Shiny app structured as an R package with several tests. The tests pass when I run devtools::test() but fail when I run devtools::check() with the error message
"Error ('test-examplemodule.R:2:3'): exampleModuleServer works
Error in eval(code, test_env)
: object 'exampleModuleServer' not found"
My code and an explanation of what I tried are below. If someone could help and let me know what I am doing wrong that would be much appreciated.
My Code
R/App.R
myApp <- function(...){
ui <- shiny::fluidPage(
# exampleModuleUI is defined in R/example-module.R
shiny::h2("Modules example"),
exampleModuleUI("examplemodule1", "Click counter #1"),
exampleModuleUI("examplemodule2", "Click counter #2")
)
server <- function(input, output, session) {
# exampleModuleServer is defined in R/example-module.R
exampleModuleServer("examplemodule1")
exampleModuleServer("examplemodule2")
}
shiny::shinyApp(ui, server)
}
R/example-module.R
exampleModuleUI <- function(id, label = "Counter") {
# All uses of Shiny input/output IDs in the UI must be namespaced,
# as in ns("x").
ns <- shiny::NS(id)
shiny::tagList(
shiny::actionButton(ns("button"), label = label),
shiny::verbatimTextOutput(ns("out"))
)
}
exampleModuleServer <- function(id) {
# moduleServer() wraps a function to create the server component of a
# module.
shiny::moduleServer(
id,
function(input, output, session) {
count <- shiny::reactiveVal(0)
shiny::observeEvent(input$button, {
count(count() + 1)
})
output$out <- shiny::renderText({
count()
})
count
}
)
}
tests/testthat/test-examplemodule.R
testthat::test_that("exampleModuleServer works", {
shiny::testServer(exampleModuleServer, {
# Set initial value of a button
session$setInputs(button = 0)
# Check the value of the reactiveVal `count()`
expect_equal(count(), 1)
# Check the value of the renderText()
expect_equal(output$out, "1")
# Simulate a click
session$setInputs(button = 1)
expect_equal(count(), 2)
expect_equal(output$out, "2")
})
})
tests/testthat/setup-shintytest2.R
# Load application support files into testing environment
shinytest2::load_app_env()
DESCRIPTION
Package: shinyTemplate
Title: What the Package Does (One Line, Title Case)
Version: 0.0.0.9000
Authors@R:
person("First", "Last", , "first.last@example.com", role = c("aut", "cre"),
comment = c(ORCID = "YOUR-ORCID-ID"))
Description: What the package does (one paragraph).
License: GPL (>= 3)
Encoding: UTF-8
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.3.1
Config/testthat/edition: 3
Imports:
shiny
Suggests:
shinytest2,
testthat
What I've Tried
The app works as expected with
devtools::load_all()
myApp()
The tests pass when I run devtools::test() but I get a warning:
devtools::test()
Testing shinyTemplate
| F W S OK | Context
| 4 | examplemodule
══ Results ════════════════════════════════════════════════════════════════════════════════════════════════
[ FAIL 0 | WARN 0 | SKIP 0 | PASS 4 ]
Warning message:
In warn_if_app_dir_is_package(appDir) :
Loading R/ subdirectory for Shiny application, but this directory appears to contain an R package. Sourcing files in R/ may cause unexpected behavior. See ?loadSupport
for more details.
When I run devtools::check the tests fail
devtools::check()
── R CMD check results ────────────────────────────────────────────────────── shinyTemplate 0.0.0.9000 ────
Duration: 6s
❯ checking tests ...
See below...
── Test failures ──────────────────────────────────────────────────────────────────────────── testthat ────
shinytest2::test_app()
Loading required package: testthat
Loading required package: shiny
| F W S OK | Context
⠏ | 0 | examplemodule
| 1 0 | examplemodule
────────────────────────────────────────────────────────────────────────────────
Error ('test-examplemodule.R:2:3'): exampleModuleServer works
Error in eval(code, test_env)
: object 'exampleModuleServer' not found
Backtrace:
▆
- └─shiny::testServer(...) at test-examplemodule.R:2:3
- └─shiny:::isModuleServer(app)
────────────────────────────────────────────────────────────────────────────────
══ Results ═════════════════════════════════════════════════════════════════════
── Failed tests ────────────────────────────────────────────────────────────────
Error ('test-examplemodule.R:2:3'): exampleModuleServer works
Error in eval(code, test_env)
: object 'exampleModuleServer' not found
Backtrace:
▆
- └─shiny::testServer(...) at test-examplemodule.R:2:3
- └─shiny:::isModuleServer(app)
[ FAIL 1 | WARN 0 | SKIP 0 | PASS 0 ]
Error: Test failures
Execution halted
1 error | 0 warnings | 0 notes
Any help you could give would be much appreciated. Thank you!