“ testthat :: expect_silent()”似乎没有注意到ggplot2错误

时间:2018-12-13 11:38:48

标签: r ggplot2 testthat

我无法理解expect_silent()testthat函数的以下行为。

expect_silent()应该在测试代码返回任何输出(例如错误或警告)时失败:

library(testthat)

test_that("expect_silent works as expected", {
  expect_silent( {
    stop()
  } )
} )
#> Error: Test failed: 'expect_silent works as expected'
#> * 
#> 1: expect_silent({
#>        stop()
#>    }) at <text>:5
#> 2: quasi_capture(enquo(object), evaluate_promise)
#> 3: capture(act$val <- eval_bare(get_expr(quo), get_env(quo)))
#> 4: withr::with_output_sink(temp, withCallingHandlers(withVisible(code), warning = handle_warning, 
#>        message = handle_message))
#> 5: force(code)
#> 6: withCallingHandlers(withVisible(code), warning = handle_warning, message = handle_message)
#> 7: withVisible(code)
#> 8: eval_bare(get_expr(quo), get_env(quo))
#> 9: stop() at <text>:6

(以上是预期的行为:expect_silent()检测到stop()产生的错误,并且测试失败。)

但是,由于某种原因,它似乎无法检测到ggplot2表达式中发生的错误。例如,以下ggplot2代码由于拼写错误而产生错误:

library(ggplot2)

ggplot(diamonds, aes(x = carrot, y = price)) +
  geom_point()
#> Error in FUN(X[[i]], ...): object 'carrot' not found

但是expect_silent()似乎无法检测到错误:

test_that("expect_silent fails when ggplot2 throws an error", {
  expect_silent( {
    ggplot(diamonds, aes(x = carrot, y = price)) +
      geom_point()
  } )
} )

(不产生任何输出。)

我误解了expect_silent()的目的吗?当我尝试使用它来测试ggplot2扩展程序时,这真让我头疼。

1 个答案:

答案 0 :(得分:1)

尝试从ggplot捕获输出,然后测试是否可以打印:

Error: Test failed: 'expect_silent fails when ggplot2 throws an error'
* object 'carrot' not found

第二项测试失败,输出大量信息,我在下面对此进行了限制:

ggplot()

更新-2018年12月15日

关于您为什么需要print()的评论:

print()函数返回ggplot类的对象。 ggplot2软件包重载了print()函数,因此它不是在R会话终端中将对象打印到STDOUT,而是打印图表。 R会话终端中的交互模式假定大多数命令都是通过print()函数运行的。

测试是在自己的环境中评估的测试。测试环境是非交互的,因此通过interactive()函数假设的运行不再成立。您可以使用基本R附带的test_that()函数对此进行测试。它应该在R会话终端中报告TRUE,并在var maxDateQuery = ctx.MyTables .Where(m => m.InsertDate >= fromDate && m.InsertDate <= toDate) .ToArray() .GroupBy(x => x.Id) .Select(g => new { Id = g.Key, MaxInsertDate = g.Max(y => y.InsertDate)) }}; 调用中报告FALSE。