Search code examples
rdevtoolsr-packagetestthat

Is R CMD check (devtools:check()) with keep.source = TRUE possible?


I'm writing unit tests using testthat to check some operations and these operations needs objects with srcref attribute. srcref attribute is added if during the package installation / building option keep.source was set to TRUE.

I see all my tests fail when using devtools::check() if those tests expect srcref attribute for object. This not happens when tests are performed interactively, i.e. using devtools:test(). What could I do to keep these tests, run it and make them pass using devtools::check()? I have tried devtools::check(args = "--with-keep.source") but this argument is not recognized.

I'm using rlang::pkg_env("my-package") to get objects with srcref attribute, so tests look like this:

testthat("my example works", {
  expect_true(!is.null(get_srcref_for_some_object(names(rlang::pkg_env("my-package")))))
})

Solution

  • The option --with-keep.source is for R CMD INSTALL, not R CMD check. To make sure that check preserves sources when it installs your package, you need to run

    R CMD check /path/to/tarball --install-args=--with-keep.source
    

    in a shell or

    devtools::check("path/to/package", args = "--install-args=--with-keep.source")
    

    in R.

    Minimal reproducible example

    pkgname <- "foo"
    usethis::create_package(pkgname, rstudio = FALSE, open = FALSE)
    setwd(pkgname)
    usethis::use_testthat()
    text <- "
    #' @title A title
    #' @description A description.
    #' @param a,b Arguments.
    #' @examples
    #' x <- add(1, 1)
    #' @export
    add <- function(a, b) a + b
    "
    cat(text, file = file.path("R", "add.R"))
    devtools::document(".")
    text <- "
    test_that(\"sources kept\", {
      expect_false(is.null(attr(add, \"srcref\")))
    })
    "
    cat(text, file = file.path("tests", "testthat", "test-add.R"))
    
    devtools::check(".")
    
    ─  checking tests ...
    ─  Running ‘testthat.R’ (357ms)
    E  Some test files failed
       Running the tests in ‘tests/testthat.R’ failed.
       Last 13 lines of output:
         > library(foo)
         > 
         > test_check("foo")
         [ FAIL 1 | WARN 0 | SKIP 0 | PASS 0 ]
         
         ══ Failed tests ════════════════════════════════════════════════════════════════
         ── Failure (test-add.R:3:3): sources kept ──────────────────────────────────────
         is.null(attr(add, "srcref")) is not FALSE
         
         `actual`:   TRUE 
         `expected`: FALSE
         
         [ FAIL 1 | WARN 0 | SKIP 0 | PASS 0 ]
         Error: Test failures
         Execution halted
    
    devtools::check(".", args = "--install-args=--with-keep.source")
    
    ─  checking tests ...
    ✓  Running ‘testthat.R’
    

    Clean

    setwd("..")
    unlink(pkgname, recursive = TRUE)