testthat:一次期望错误和变量值?

testthat: Expect error and variable value at once?

我想测试一个可以抛出错误的函数,但我也想确保变量值是正确的(以验证错误发生前的预期最后状态 - 所以我想测试不需要的副作用)。可以这样做吗?

要测试的简化表达式

x <- 1    # could also be made "global" by "<<-"
stop("damn, an error occured")

我该如何做

testthat("double check",
  expect_error_and_TRUE( x == 1, {
                                   x <- 1
                                   stop("damn, an error occured")
                                 }))

我找不到 "stack"(管道)expect 函数的方法?

如果 函数 returns 一个值,它不会抛出错误,否则会舍入。如果愿意,您可以在 expect_error 中测试特定字符串,这样您就可以在错误中设置 x.

的值
{
    x <- 1
    stop("damn, an error occured")
}
## Error: damn, an error occured
x
## [1] 1
rm(x)
f <- function(){
    x <- 1
    stop("damn, an error occured")
}
f() == 1
## Error in f() : damn, an error occured
expect_error(f(), "damn, an error occured")

f <- function(){
    x <- 1
    stop("damn, an error occured, x is ", x)
}
expect_error(f(), "x is 1")

我建议不要在函数外测试代码,因为它取决于环境,它在哪里 运行,所以如果你 运行 它在测试文件中它可能不一样如代码的 "main" 部分

这里有一个更好的例子来测试不需要的副作用 - 以及一个简单的解决方案:

library(testthat)

counter <- 1

test_that("error occurs but does not change the previous value", {

  expect_error(if (log("a") == 42) counter <- counter + 1)
  expect_equal(counter, 1)

})