Skip to content

Commit aebd2f0

Browse files
committed
Merged origin/main into oo-mocking-enhancement
2 parents 24067ed + ceeadda commit aebd2f0

14 files changed

Lines changed: 100 additions & 42 deletions

NEWS.md

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

33
* `local_mocked_s3_method()` and `local_mocked_s4_method()` can now mock methods that don't already exist, and can use `definition = NULL` to temporarily remove a method. `local_mocked_s4_method()` now also works when the generic is defined in another package (#2302).
4+
* `expect_success()` and `expect_failure()` are more clear about what the expectation actually did (#2297).
5+
* The hint to use `snapshot_download_gh()` is now only emitted when running in a job named "R-CMD-check" (#2300).
6+
* `expect_snapshot_file()` correctly reports file name if duplicated (@MichaelChirico, #2296).
47
* Fixed support for `shinytest2::AppDriver$expect_values()` screenshot snapshot failing on CI (#2293, #2288).
58

69
* testthat now emits OpenTelemetry traces for tests when tracing is enabled. Requires the otel and otelsdk packages (#2282).

R/expect-comparison.R

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ failure_compare <- function(act, exp, operator) {
7474
actual_op
7575
)
7676
}
77-
7877
} else {
7978
msg_act <- sprintf(
8079
"Actual comparison: \"%s\" %s \"%s\"",

R/expect-constant.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#' a <- 1:4
2020
#' show_failure(expect_true(length(a) == 3))
2121
#' show_failure(expect_equal(length(a), 3))
22-
#'
22+
#'
2323
#' x <- c(TRUE, TRUE, FALSE, TRUE)
2424
#' show_failure(expect_true(all(x)))
2525
#' show_failure(expect_all_true(x))

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

R/reporter-check.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ summary_line <- function(n_fail, n_warn, n_skip, n_pass) {
123123
snapshot_check_hint <- function() {
124124
intro <- "To review and process snapshots locally:"
125125

126-
if (on_gh()) {
126+
if (on_gh() && Sys.getenv("GITHUB_JOB") == "R-CMD-check") {
127127
repository <- Sys.getenv("GITHUB_REPOSITORY")
128128
run_id <- Sys.getenv("GITHUB_RUN_ID")
129129

R/snapshot-github.R

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
#' take the artifacts from.
88
#'
99
#' Note that you should not generally need to use this function manually;
10-
#' instead copy and paste from the hint emitted on GitHub.
10+
#' instead copy and paste from the hint emitted on GitHub. This hint is only
11+
#' emitted when running in a job named "R-CMD-check", since that's where the
12+
#' testthat artifact is typically uploaded.
1113
#'
1214
#' @param repository Repository owner/name, e.g. `"r-lib/testthat"`.
1315
#' @param run_id Run ID, e.g. `"47905180716"`. You can find this in the action url.
14-
#' @param dest_dir Directory to download to. Defaults to the current directory.
16+
#' @param dest_dir Package root directory. Defaults to the current directory.
1517
#' @export
1618
snapshot_download_gh <- function(repository, run_id, dest_dir = ".") {
1719
check_string(repository)

R/snapshot-reporter.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ SnapshotReporter <- R6::R6Class(
135135
save_path <- paste0(c(self$file, variant, name), collapse = "/")
136136
if (save_path %in% self$snap_file_saved) {
137137
cli::cli_abort(
138-
"Snapshot file names must be unique. {.arg name} has already been used.",
138+
"Snapshot file names must be unique. {.val {name}} has already been used.",
139139
call = trace_env
140140
)
141141
}

R/test-files.R

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,6 @@ test_files <- function(
149149
shuffle = FALSE,
150150
error_call = caller_env()
151151
) {
152-
153152
# Must keep these two blocks in sync
154153
if (parallel) {
155154
test_files_parallel(

man/snapshot_download_gh.Rd

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

0 commit comments

Comments
 (0)