如何使用testthat包函数测试向量元素是否符合函数入参要求
问题原因与解决方案
你遇到的报错是因为input1 > 0会返回和输入向量等长的逻辑向量,而expect_true()、expect_gt()这类基础断言函数要求输入的判断结果为单个逻辑值,因此无法直接作用于多元素向量。
下面是两种常用的实现方式:
方案1:用all()聚合判断结果(最简便)
直接用Base R的all()函数把向量逻辑判断的结果聚合为单个逻辑值,只要有任意一个元素不满足大于0的要求,就会返回FALSE触发测试失败:
test_that("myfunction参数校验符合预期", { # 1. 测试非法入参场景:含负数的输入 bad_input1 <- c(200, -220, 250) good_input2 <- c(30, 40, 50) # 若函数内部已做入参校验,传入非法参数时应抛出预期错误,用expect_error捕获 expect_error(myfunction(bad_input1, good_input2), "你函数设定的入参错误提示") # 2. 测试合法入参场景 good_input1 <- c(200, 220, 250) good_input2 <- c(30, 40, 50) # 校验参数规则 expect_equal(length(good_input1), length(good_input2)) expect_true(all(good_input1 > 0)) expect_true(all(good_input2 > 0)) # 校验合法入参下函数可正常运行 expect_no_error(myfunction(good_input1, good_input2)) })
方案2:用testthat原生expect_all()(调试更友好)
testthat 3.0.0及以上版本提供了专门针对向量全元素校验的expect_all()函数,搭配内置谓词使用,报错时会明确提示不符合要求的元素位置,调试效率更高:
# 替换原来的expect_true语句即可 expect_all(good_input1, gt(0)) expect_all(good_input2, gt(0))
注意:不要先调用函数再做参数合法性断言,若函数内部已做入参校验,传入非法参数时函数会直接报错,导致后续断言语句无法执行。测试非法入参场景时,直接用
expect_error()校验函数抛出的错误是否符合预期即可。
内容的提问来源于stack exchange,提问作者Thuy Nguyen
相关产品推荐
相关产品推荐

