【问题标题】:testthat: Expect error and variable value at once?testthat:同时期望错误和变量值?
【发布时间】:2017-08-27 22:46:25
【问题描述】:

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

要测试的简化表达式

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")
                                 }))

我找不到“堆叠”(管道)expect 函数的方法?

【问题讨论】:

标签: r testing testthat


【解决方案1】:

如果一个函数返回一个值,它不会抛出错误,否则会舍入。如果你愿意,你可以在 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")

我建议不要在函数之外测试代码,因为它取决于运行它的环境,所以如果您在测试文件中运行它,它可能与代码的“主要”部分不同

【讨论】:

  • 感谢详细信息,如果我可以并且想要修改错误消息以显示函数内部“状态”,这确实有效。我想我应该澄清我的问题:我不想测试返回值,而是测试我不想在错误消息中显示的函数的副作用(是的,一个非常理论的案例)。由于我没有写这个问题,我接受你的回答。再次感谢!
  • 根据函数的副作用(通常需要避免除了绘图和全局配置),您可以寻找测试绘图函数。
  • 我同意,测试副作用不是您在单元测试中的常用方法(而是将函数视为黑盒单元)。
【解决方案2】:

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

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)

})

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 2014-01-20
    • 1970-01-01
    • 2016-05-08
    • 2015-09-05
    • 2019-10-03
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多