我需要测试包加载操作(对于我的多版本包)并且知道卸载命名空间和东西是危险的工作。所以我想在一个新的 R 会话中运行每个测试。并行运行我的测试不能满足这个需求,因为它会重用从站,并且这些会变脏。
所以我想callr::r
会帮助我。不幸的是,我再次被记录在案的记者所困。
以下是一个最小的示例。放在文件中test-mytest.R
。
test_that('test 1', {
expect_equal(2+2, 5)
})
reporter_in <- testthat::get_reporter()
# -- 1 --
reporter_out <- callr::r(
function(reporter) {
reporter <- testthat::with_reporter(reporter, {
testthat::test_that("test inside", {
testthat::expect_equal('this', 'wont match')
})
})
},
args = list(reporter = reporter_in),
show = TRUE
)
# -- 2 --
testthat::set_reporter(reporter_out)
# -- 3 --
test_that('test 2', {
expect_equal(2+2, 8)
})
我使用以下方法调用了这个测试文件:
# to be able to check the outcome, work with a specific reporter
summary <- testthat::SummaryReporter$new()
testthat::test_file('./tests/testthat/test-mytest.R', reporter = summary)
这似乎可以满足我的要求,但是在查看结果时...
> summary$end_reporter()
== Failed ===============================================================================================
-- 1. Failure (test-load_b_pick_last_true.R:5:5): test 1 ------------------------------------------------
2 + 2 (`actual`) not equal to 5 (`expected`).
`actual`: 4
`expected`: 5
== DONE =================================================================================================
...这只是返回的第一个测试。
这个怎么运作:
- 执行普通测试。
- 获取当前使用的记者(
-- 1 --
) callr::r
用于调用包含测试的测试块。- 在通话中,我尝试使用
set_reporter
,但with_reporter
实际上是相同的。 - 呼叫返回记者(用
callr::r
尝试过get_reporter()
,但with_reporter
也返回记者(隐形))
现在返回的记者似乎很好,但是当将其设置为实际的记者时set_reporter
,似乎并没有覆盖实际的记者。
请注意,在 处-- 2 --
,reporter_out
包含两个测试结果。
问题
我不确定我希望它做什么,但最后我希望将结果添加到原始报告器((summary
或)reporter_in
,也就是说,如果那不是某种副本)。