Get more useful output from testthat::expect_equal()

65 views Asked by At

In the following example, the actual vector is missing two elements: OH1 and PA-PPL2. Is there a way to get more useful output than what expect_equal() gives here? I'd like to know which items are missing from actual, not just that the counts are different.

library(testthat)

test_that(
  'files are named correctly',
  {
    expected <- c(AMEREN1 = "AMEREN24.01.15_March-1_DM_RL.pdf", COMED1 = "COMED24.01.15_March-1_DM_RL.pdf", 
                  `MD-OTH1` = "MD-OTH24.01.15_March_DM_RL.pdf", MD1 = "MD24.01.15_March_DM_RL.pdf", 
                  NJ1 = "NJ24.01.15_March_DM_RL.pdf", OH1 = "OH24.01.15_March_DM_RL.pdf", 
                  PA1 = "PA24.01.15_March_DM_RL.pdf", AMEREN2 = "AMEREN24.01.15_March-2_DM_RL.pdf", 
                  COMED2 = "COMED24.01.15_March-2_DM_RL.pdf", `PA-DUQ2` = "PA24.01.15_March-DUQ_DM_RL.pdf", 
                  `PA-METED2` = "PA24.01.15_March-METED_DM_RL.pdf", `PA-PECO2` = "PA24.01.15_March-PECO_DM_RL.pdf", 
                  `PA-PENELEC2` = "PA24.01.15_March-PENELEC_DM_RL.pdf", `PA-PENN2` = "PA24.01.15_March-PENN_DM_RL.pdf", 
                  `PA-PPL2` = "PA24.01.15_March-PPL_DM_RL.pdf", `PA-WPP2` = "PA24.01.15_March-WPP_DM_RL.pdf"
    )
    actual <- c(AMEREN1 = "AMEREN24.01.15_March-1_DM_RL.pdf", COMED1 = "COMED24.01.15_March-1_DM_RL.pdf", 
                `MD-OTH1` = "MD-OTH24.01.15_March_DM_RL.pdf", MD1 = "MD24.01.15_March_DM_RL.pdf", 
                NJ1 = "NJ24.01.15_March_DM_RL.pdf", PA1 = "PA24.01.15_March_DM_RL.pdf", 
                AMEREN2 = "AMEREN24.01.15_March-2_DM_RL.pdf", COMED2 = "COMED24.01.15_March-2_DM_RL.pdf", 
                `PA-DUQ2` = "PA24.01.15_March-DUQ_DM_RL.pdf", `PA-METED2` = "PA24.01.15_March-METED_DM_RL.pdf", 
                `PA-PECO2` = "PA24.01.15_March-PECO_DM_RL.pdf", `PA-PENELEC2` = "PA24.01.15_March-PENELEC_DM_RL.pdf", 
                `PA-PENN2` = "PA24.01.15_March-PENN_DM_RL.pdf", `PA-WPP2` = "PA24.01.15_March-WPP_DM_RL.pdf"
    )
    
    expect_equal(
      actual,
      expected
    )
  }
)
#> -- Failure ('<text>:24'): files are named correctly ----------------------------
#> `actual` not equal to `expected`.
#> Lengths differ: 14 is not 16
#> Error in `reporter$stop_if_needed()`:
#> ! Test failed
#> Backtrace:
#>      x
#>   1. \-testthat::test_that(...)
#>   2.   \-withr (local) `<fn>`(`<env>`)
#>   3.     +-base::tryCatch(...)
#>   4.     | \-base (local) tryCatchList(expr, classes, parentenv, handlers)
#>   5.     |   \-base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#>   6.     |     \-base (local) doTryCatch(return(expr), name, parentenv, handler)
#>   7.     \-base::eval(handler$expr, handler$envir)
#>   8.       \-base::eval(handler$expr, handler$envir)
#>   9.         \-reporter$stop_if_needed()
#>  10.           \-rlang::abort("Test failed")

Created on 2023-12-26 with reprex v2.0.2

1

There are 1 answers

2
Alexlok On BEST ANSWER

In {testthat} 3rd edition, the expect_equal() comparison is done with waldo::compare(), which will give more details. You are probably using {testthat} 2nd edition, where expect_equal() uses all.equal().

You can temporarily switch to the 3rd edition for this test with:

testthat::local_edition(3)

or activate it globally as described here.

With a the reprex:

library(testthat)

test_that(
  'files are named correctly',
  {
    local_edition(3)
    expected <- c(AMEREN1 = "AMEREN24.01.15_March-1_DM_RL.pdf", COMED1 = "COMED24.01.15_March-1_DM_RL.pdf", 
                  `MD-OTH1` = "MD-OTH24.01.15_March_DM_RL.pdf", MD1 = "MD24.01.15_March_DM_RL.pdf", 
                  NJ1 = "NJ24.01.15_March_DM_RL.pdf", OH1 = "OH24.01.15_March_DM_RL.pdf", 
                  PA1 = "PA24.01.15_March_DM_RL.pdf", AMEREN2 = "AMEREN24.01.15_March-2_DM_RL.pdf", 
                  COMED2 = "COMED24.01.15_March-2_DM_RL.pdf", `PA-DUQ2` = "PA24.01.15_March-DUQ_DM_RL.pdf", 
                  `PA-METED2` = "PA24.01.15_March-METED_DM_RL.pdf", `PA-PECO2` = "PA24.01.15_March-PECO_DM_RL.pdf", 
                  `PA-PENELEC2` = "PA24.01.15_March-PENELEC_DM_RL.pdf", `PA-PENN2` = "PA24.01.15_March-PENN_DM_RL.pdf", 
                  `PA-PPL2` = "PA24.01.15_March-PPL_DM_RL.pdf", `PA-WPP2` = "PA24.01.15_March-WPP_DM_RL.pdf"
    )
    actual <- c(AMEREN1 = "AMEREN24.01.15_March-1_DM_RL.pdf", COMED1 = "COMED24.01.15_March-1_DM_RL.pdf", 
                `MD-OTH1` = "MD-OTH24.01.15_March_DM_RL.pdf", MD1 = "MD24.01.15_March_DM_RL.pdf", 
                NJ1 = "NJ24.01.15_March_DM_RL.pdf", PA1 = "PA24.01.15_March_DM_RL.pdf", 
                AMEREN2 = "AMEREN24.01.15_March-2_DM_RL.pdf", COMED2 = "COMED24.01.15_March-2_DM_RL.pdf", 
                `PA-DUQ2` = "PA24.01.15_March-DUQ_DM_RL.pdf", `PA-METED2` = "PA24.01.15_March-METED_DM_RL.pdf", 
                `PA-PECO2` = "PA24.01.15_March-PECO_DM_RL.pdf", `PA-PENELEC2` = "PA24.01.15_March-PENELEC_DM_RL.pdf", 
                `PA-PENN2` = "PA24.01.15_March-PENN_DM_RL.pdf", `PA-WPP2` = "PA24.01.15_March-WPP_DM_RL.pdf"
    )
    
    expect_equal(
      actual,
      expected
    )
  }
)
#> ── Failure: files are named correctly ──────────────────────────────────────────
#> `actual` (`actual`) not equal to `expected` (`expected`).
#> 
#>      names(actual) | names(expected)               
#>  [3] "MD-OTH1"     | "MD-OTH1"       [3]           
#>  [4] "MD1"         | "MD1"           [4]           
#>  [5] "NJ1"         | "NJ1"           [5]           
#>  [6] "PA1"         - "OH1"           [6]           
#>  [7] "AMEREN2"     - "PA1"           [7]           
#>  [8] "COMED2"      - "AMEREN2"       [8]           
#>  [9] "PA-DUQ2"     - "COMED2"        [9]           
#> [10] "PA-METED2"   - "PA-DUQ2"       [10]          
#> [11] "PA-PECO2"    - "PA-METED2"     [11]          
#> [12] "PA-PENELEC2" - "PA-PECO2"      [12]          
#>  ... ...             ...             and 4 more ...
#> 
#> actual[3:14] vs expected[3:16]
#>   MD-OTH1"MD-OTH24.01.15_March_DM_RL.pdf"
#>   MD1"MD24.01.15_March_DM_RL.pdf"
#>   NJ1"NJ24.01.15_March_DM_RL.pdf"
#> - PA1"PA24.01.15_March_DM_RL.pdf"
#> + OH1"OH24.01.15_March_DM_RL.pdf"
#> - AMEREN2"AMEREN24.01.15_March-2_DM_RL.pdf"
#> + PA1"PA24.01.15_March_DM_RL.pdf"
#> - COMED2"COMED24.01.15_March-2_DM_RL.pdf"
#> + AMEREN2"AMEREN24.01.15_March-2_DM_RL.pdf"
#> - PA-DUQ2"PA24.01.15_March-DUQ_DM_RL.pdf"
#> + COMED2"COMED24.01.15_March-2_DM_RL.pdf"
#> - PA-METED2"PA24.01.15_March-METED_DM_RL.pdf"
#> + PA-DUQ2"PA24.01.15_March-DUQ_DM_RL.pdf"
#> - PA-PECO2"PA24.01.15_March-PECO_DM_RL.pdf"
#> + PA-METED2"PA24.01.15_March-METED_DM_RL.pdf"
#> - PA-PENELEC2"PA24.01.15_March-PENELEC_DM_RL.pdf"
#> + PA-PECO2"PA24.01.15_March-PECO_DM_RL.pdf"
#> and 4 more ...
#> Error:
#> ! Test failed
#> Backtrace:
#>      ▆
#>   1. └─testthat::test_that(...)
#>   2.   └─withr (local) `<fn>`(`<env>`)
#>   3.     ├─base::tryCatch(...)
#>   4.     │ └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#>   5.     │   └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#>   6.     │     └─base (local) doTryCatch(return(expr), name, parentenv, handler)
#>   7.     └─base::eval(handler$expr, handler$envir)
#>   8.       └─base::eval(handler$expr, handler$envir)
#>   9.         └─reporter$stop_if_needed()
#>  10.           └─rlang::abort("Test failed", call = NULL)

Created on 2023-12-26 with reprex v2.0.2