【问题标题】:How to make a test fail with the testthat package?如何使用 testthat 包使测试失败?
【发布时间】:2012-09-12 12:01:16
【问题描述】:

我有一个测试,如果不满足先决条件(例如,缺少文件或其他东西),我想让它失败。

只是为了澄清,这是我想做的一个例子:

test_that("...", {
    if ( ... precondition to execute the test is not met... ) {
        expect_true(FALSE) # Make it fail without going further
    }

    expect_that( ... real test here ...)
})

现在我的问题是: testthat 包中是否有类似fail() 的期望,或者我必须一直写expect_true(FALSE)

【问题讨论】:

  • 如果你只是期望前置条件测试通过(expect_true),那么失败自然会发生......我仍然不明白为什么我的答案不正确。
  • @Spacedman 原因是你没有回答我的问题,你可以在我的问题中找到粗体字:-) testthat我>?
  • 那么你想要的不是'fail()-like期望'(这有点无意义),而是一种引发失败条件的方法? stop("reason for fail") 可能会这样做。
  • 其他测试工具,例如 JUnit,例如 supports it。正如我所展示的,expect_true(FALSE) 是一个可行的解决方案,但我很感兴趣是否有内置机制(即 testthat 库中的 expectation)。跨度>
  • 文档和源代码会迅速告诉您没有完全等价的。不过,我不确定它有多大价值,因为大多数时候我认为最好不满足您的要求而不是强迫它。随便。

标签: r unit-testing testthat


【解决方案1】:

目前testthat 中没有fail 函数。我想你想要类似的东西

fail <- function(message = "Failure has been forced.", info = NULL, label = NULL)
{
  expect_that(
    NULL,
    function(message)
    {
      expectation(FALSE, message) 
    },
    info,
    label
  )
}

例如,用法是

test_that("!!!", fail())

【讨论】:

  • 看看 Hadley 是否会将其粘贴到包装中:github.com/hadley/test_that
  • 你需要说服他这很有用。
  • 我今天刚刚说服 OP 不是这样。我不会试图说服你。我的意思是“他”。
  • @hadley:向问题跟踪器添加了一个稍微有用的用例。
【解决方案2】:

失败不是一种选择……

尝试使用stop

test_that("testingsomething", {
  if(file.exists("foo.txt")){
      stop("foo.txt already exists")
   }
  foo = writeFreshVersion("foo.txt")
  expect_true(file.exists("foo.txt"))
}
)

【讨论】:

  • 正如我上面写的,如果不满足运行它的条件,我想测试失败,例如:foo() 写入文件,我想确保它之前不存在并且在函数调用之后存在(是的,在您提到的 test_that 块内)。但是如果文件存在,我可能会考虑在无法验证之前通过测试失败,如果foo() 创建它。
  • 那么你需要在你的代码块中检查你的先决条件。您期望失败或想要检查返回值的东西进入expect_something() 部分,您想要工作的代码或如果它不起作用则返回测试失败的代码只是进入 test_that 块。我会稍微修改一下。
  • 试图澄清问题。
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
相关资源
最近更新 更多