Я хотел бы протестировать функцию по новому набору чисел для каждого теста. Идея заключается в том, чтобы добиться неудачи в тех случаях, которые я не ожидал.Испытание «случайной единицы»
library(testthat)
hypotenuse_length <- function(a, b){
sqrt(a^2 + b^2)
}
bad_hypotenuse_length <- function(a, b){
sqrt(a^2 + b^2) + 1
}
test_that("Hypotenuse is always less than sum of other two sides", {
a <- abs(rcauchy(1))
b <- abs(rcauchy(1))
expect_lte(bad_hypotenuse_length(a, b), a + b)
})
Вопрос заключается в том, что, когда я получаю отказ, я не знаю, какие значения a
и b
вызвало сбой.
я могу добиться этого для конкретной операции, с помощью обратной инженерии expect_lte
:
my_expect_lte <- function(a, b, actual, expected, label = NULL, expected.label = NULL){
op <- match.fun("<=")
lab_act <- testthat:::make_label(actual, label)
lab_exp <- testthat:::make_label(expected, expected.label)
stopifnot(is.numeric(actual), length(actual) == 1)
stopifnot(is.numeric(expected), length(expected) == 1)
msg <- "not less than"
diff <- actual - expected
testthat::expect(op(diff, 0),
sprintf("%s is %s %s. Difference: %.3g. a = %.3g b = %.3g",
lab_act, msg, lab_exp, diff, a, b))
}
set.seed(1) # not ordinarily present
a <- abs(rcauchy(1))
b <- abs(rcauchy(1))
my_expect_lte(a, b, bad_hypotenuse_length(a, b), a + b)
Error: bad_hypotenuse_length(a, b) is not less than a + b. Difference: 0.143. a = 1.1 b = 2.35
Есть ли способ использовать существующие функции для возвращения подобной информации? То есть, возвращает то же, что и expect_...
, но также включает значение переданных аргументов. (Решение Printing custom diagnostic information if `testthat` test fails in `R` либо распечатывает информацию независимо от результата теста, либо не соответствует существующим испытаниям.)