`testthat::expect_silent()` 似乎没有注意到 ggplot2 错误
`testthat::expect_silent()` does not seem to notice ggplot2 errors
我无法理解 expect_silent()
function from testthat.
的以下行为
expect_silent()
应该在测试代码 returns 任何输出时失败,例如错误或警告:
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 扩展。
尝试从 ggplot 捕获输出,然后测试它是否可以打印:
library(ggplot2)
library(testthat)
# First test should succeed (no output)
test_that("silent when ggplot2 succeeds", {
working.plot <- ggplot(diamonds, aes(x = carat, y = price)) + geom_point()
expect_silent(print(working.plot))
} )
# Second test should fail
test_that("fails when ggplot2 throws an error", {
broken.plot <- ggplot(diamonds, aes(x = carrot, y = price)) + geom_point()
expect_silent(print(broken.plot))
} )
第二个测试失败了,我在下面缩减了丰富的输出:
Error: Test failed: 'expect_silent fails when ggplot2 throws an error'
* object 'carrot' not found
更新 - 2018 年 12 月 15 日
关于您关于为什么需要 print() 的评论:
ggplot()
函数 returns class ggplot 的一个对象。 ggplot2 包重载了 print()
函数,因此它不会在 R 会话终端中将对象打印到 STDOUT,而是打印图表。 R会话终端中的交互模式假设大部分命令都是通过print()
函数运行。
测试在他们自己的环境中进行评估。测试环境是非交互式的,因此通过 print()
函数假设的 运行ning 不再成立。您可以使用基础 R 附带的 interactive()
函数对此进行测试。它应该在 R 会话终端中报告 TRUE,在 test_that()
调用中报告 FALSE。
我无法理解 expect_silent()
function from testthat.
expect_silent()
应该在测试代码 returns 任何输出时失败,例如错误或警告:
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 扩展。
尝试从 ggplot 捕获输出,然后测试它是否可以打印:
library(ggplot2)
library(testthat)
# First test should succeed (no output)
test_that("silent when ggplot2 succeeds", {
working.plot <- ggplot(diamonds, aes(x = carat, y = price)) + geom_point()
expect_silent(print(working.plot))
} )
# Second test should fail
test_that("fails when ggplot2 throws an error", {
broken.plot <- ggplot(diamonds, aes(x = carrot, y = price)) + geom_point()
expect_silent(print(broken.plot))
} )
第二个测试失败了,我在下面缩减了丰富的输出:
Error: Test failed: 'expect_silent fails when ggplot2 throws an error'
* object 'carrot' not found
更新 - 2018 年 12 月 15 日
关于您关于为什么需要 print() 的评论:
ggplot()
函数 returns class ggplot 的一个对象。 ggplot2 包重载了 print()
函数,因此它不会在 R 会话终端中将对象打印到 STDOUT,而是打印图表。 R会话终端中的交互模式假设大部分命令都是通过print()
函数运行。
测试在他们自己的环境中进行评估。测试环境是非交互式的,因此通过 print()
函数假设的 运行ning 不再成立。您可以使用基础 R 附带的 interactive()
函数对此进行测试。它应该在 R 会话终端中报告 TRUE,在 test_that()
调用中报告 FALSE。