Skip to content

Commit ceeadda

Browse files
Always report success/failure count (#2298)
1 parent 75990de commit ceeadda

File tree

4 files changed

+78
-29
lines changed

4 files changed

+78
-29
lines changed

NEWS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# testthat 3.3.1
22

3+
* `expect_success()` and `expect_failure()` are more clear about what the expectation actually did (#2297).
34
* The hint to use `snapshot_download_gh()` is now only emitted when running in a job named "R-CMD-check" (#2300).
45
* `expect_snapshot_file()` correctly reports file name if duplicated (@MichaelChirico, #2296).
56
* Fixed support for `shinytest2::AppDriver$expect_values()` screenshot snapshot failing on CI (#2293, #2288).

R/expect-self-test.R

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,36 @@ capture_success_failure <- function(expr) {
2626
)
2727
}
2828

29+
format_success_failure <- function(status, exp_n_success, exp_n_failure) {
30+
pluralise <- function(n, singular, plural) {
31+
paste(n, ngettext(n, singular, plural))
32+
}
33+
34+
tick <- cli::col_green(cli::symbol$tick)
35+
cross <- cli::col_red(cli::symbol$cross)
36+
37+
success_ok <- status$n_success == exp_n_success
38+
failure_ok <- status$n_failure == exp_n_failure
39+
40+
c(
41+
sprintf(
42+
"Expected %s and %s.",
43+
pluralise(exp_n_success, "success", "successes"),
44+
pluralise(exp_n_failure, "failure", "failures")
45+
),
46+
sprintf(
47+
"%s Observed %s.",
48+
if (success_ok) tick else cross,
49+
pluralise(status$n_success, "success", "successes")
50+
),
51+
sprintf(
52+
"%s Observed %s.",
53+
if (failure_ok) tick else cross,
54+
pluralise(status$n_failure, "failure", "failures")
55+
)
56+
)
57+
}
58+
2959
#' Test your custom expectations
3060
#'
3161
#' @description
@@ -44,17 +74,11 @@ capture_success_failure <- function(expr) {
4474
expect_success <- function(expr) {
4575
status <- capture_success_failure(expr)
4676

47-
expected <- "Expected exactly one success and no failures."
48-
if (status$n_success != 1) {
49-
actual <- sprintf("Actually succeeded %i times", status$n_success)
50-
fail(c(expected, actual))
51-
} else if (status$n_failure > 0) {
52-
actual <- sprintf("Actually failed %i times", status$n_failure)
53-
fail(c(expected, actual))
54-
} else {
77+
if (status$n_success == 1 && status$n_failure == 0) {
5578
pass()
79+
return(invisible())
5680
}
57-
81+
fail(format_success_failure(status, exp_n_success = 1, exp_n_failure = 0))
5882
invisible()
5983
}
6084

@@ -63,21 +87,17 @@ expect_success <- function(expr) {
6387
expect_failure <- function(expr, message = NULL, ...) {
6488
status <- capture_success_failure(expr)
6589

66-
expected <- "Expected exactly one failure and no successes."
67-
if (status$n_failure != 1) {
68-
actual <- sprintf("Actually failed %i times", status$n_failure)
69-
fail(c(expected, actual))
70-
} else if (status$n_success != 0) {
71-
actual <- sprintf("Actually succeeded %i times", status$n_success)
72-
fail(c(expected, actual))
73-
} else {
90+
if (status$n_failure == 1 && status$n_success == 0) {
7491
if (is.null(message)) {
7592
pass()
7693
} else {
7794
act <- labelled_value(status$last_failure$message, "failure message")
7895
expect_match_(act, message, ..., title = "message")
7996
}
97+
return(invisible())
8098
}
99+
100+
fail(format_success_failure(status, exp_n_success = 0, exp_n_failure = 1))
81101
invisible()
82102
}
83103

tests/testthat/_snaps/expect-self-test.md

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,30 @@
44
expect_failure(expect_no_failure())
55
Condition
66
Error:
7-
! Expected exactly one failure and no successes.
8-
Actually failed 0 times
7+
! Expected 0 successes and 1 failure.
8+
v Observed 0 successes.
9+
x Observed 0 failures.
910
Code
1011
expect_failure(expect_many_failures())
1112
Condition
1213
Error:
13-
! Expected exactly one failure and no successes.
14-
Actually failed 2 times
14+
! Expected 0 successes and 1 failure.
15+
v Observed 0 successes.
16+
x Observed 2 failures.
1517
Code
1618
expect_failure(expect_has_success())
1719
Condition
1820
Error:
19-
! Expected exactly one failure and no successes.
20-
Actually succeeded 1 times
21+
! Expected 0 successes and 1 failure.
22+
x Observed 1 success.
23+
v Observed 1 failure.
24+
Code
25+
expect_failure(expect_both_wrong())
26+
Condition
27+
Error:
28+
! Expected 0 successes and 1 failure.
29+
x Observed 1 success.
30+
x Observed 0 failures.
2131
Code
2232
expect_failure(expect_failure_foo(), "bar")
2333
Condition
@@ -52,20 +62,30 @@
5262
expect_success(expect_no_success())
5363
Condition
5464
Error:
55-
! Expected exactly one success and no failures.
56-
Actually succeeded 0 times
65+
! Expected 1 success and 0 failures.
66+
x Observed 0 successes.
67+
v Observed 0 failures.
5768
Code
5869
expect_success(expect_many_successes())
5970
Condition
6071
Error:
61-
! Expected exactly one success and no failures.
62-
Actually succeeded 2 times
72+
! Expected 1 success and 0 failures.
73+
x Observed 2 successes.
74+
v Observed 0 failures.
6375
Code
6476
expect_success(expect_has_failure())
6577
Condition
6678
Error:
67-
! Expected exactly one success and no failures.
68-
Actually failed 1 times
79+
! Expected 1 success and 0 failures.
80+
v Observed 1 success.
81+
x Observed 1 failure.
82+
Code
83+
expect_success(expect_both_wrong())
84+
Condition
85+
Error:
86+
! Expected 1 success and 0 failures.
87+
x Observed 0 successes.
88+
x Observed 1 failure.
6989

7090
# expect_no are deprecated
7191

tests/testthat/test-expect-self-test.R

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@ test_that("expect_failure() generates a useful error messages", {
3131
fail()
3232
pass()
3333
}
34+
expect_both_wrong <- function() {
35+
pass()
36+
}
3437
expect_failure_foo <- function() fail("foo")
3538

3639
expect_snapshot_failure({
3740
expect_failure(expect_no_failure())
3841
expect_failure(expect_many_failures())
3942
expect_failure(expect_has_success())
43+
expect_failure(expect_both_wrong())
4044
expect_failure(expect_failure_foo(), "bar")
4145
})
4246
})
@@ -76,11 +80,15 @@ test_that("expect_success() generates a useful error messages", {
7680
fail()
7781
pass()
7882
}
83+
expect_both_wrong <- function() {
84+
fail()
85+
}
7986

8087
expect_snapshot_failure({
8188
expect_success(expect_no_success())
8289
expect_success(expect_many_successes())
8390
expect_success(expect_has_failure())
91+
expect_success(expect_both_wrong())
8492
})
8593
})
8694

0 commit comments

Comments
 (0)