r - 使用 testthat 测试函数参数的条件
问题描述
我有一个形式的函数func(expr, data.sizes)
,其中参数expr
是一个表达式,而命名data.sizes
的通常是顾名思义,一个向量或数据大小序列。(例如:c(10, 100, 1000)
或10^seq(1, 3)
)
我想使用 为我的函数参数编写一些测试用例testthat
,但对 R 中的单元测试是新手,所以我想知道一个函数参数的测试条件是如何使用的testthat
?
例如,我想检查data.size
函数中参数的可能 NA 值,我编写了此代码段以在控制台中进行测试:(函数在 Global Env 中可用。)
test_that("NA test for data.sizes", {
expect_false(is.na(data.sizes %in% func(expression, data.sizes = c(10, 100))))
})
引发错误:
* object 'data.sizes' not found
1: expect_false(is.na(data.sizes %in% func(expression, data.sizes = c(10,
10)))) at :2
2: quasi_label(enquo(object), label, arg = "object")
3: eval_bare(get_expr(quo), get_env(quo))
4: data.sizes %in% func(expression, data.sizes = c(10, 10))
我可能做错了什么?另外,使用 testthat 在函数参数上应用测试条件的一般语法是什么?
解决方案
您的单元测试可以使用给定的输入测试函数的输出。这不是一种允许您的函数筛选给定变量以查找不适当输入的方法。这必须在您的函数内部完成。
单元测试必须简单地使用一些参数调用您的函数,并确保输出符合预期。
例如,假设您要func
返回一个列表,其中包含根据 计算的表达式的重复data.sizes
,如下所示:
func <- function(expression, data.sizes)
{
expression <- as.expression(as.list(match.call())$expression)
if(!all(!is.na(data.sizes))) stop("data.sizes may not contain NAs")
lapply(data.sizes, function(x) rep(eval(expression), x))
}
所以它做这样的事情:
y <- 5
func(y^2 + 3, 1:3)
#> [[1]]
#> [1] 28
#>
#> [[2]]
#> [1] 28 28
#>
#> [[3]]
#> [1] 28 28 28
NA
但是,如果存在以下值,您希望抛出异常data.sizes
:
func(y^2 + 3, c(1, NA))
#> Error in func(y^2 + 3, c(1, NA)) : data.sizes may not contain NAs
然后您的单元测试将如下所示:
test_that("NA test for data.sizes", {
expect_list(func(y^2 + 3, 1:3))
expect_error(func(y^2 + 3, c(1, NA)))
})
所以你知道如果这个测试通过了,你的错误就会被恰当地发现
推荐阅读
- nlog - 带有非格式化消息的 JsonLayout
- python - 为什么我在 Python 中的 SHAP 图返回灰色而不是红色和蓝色?
- c++ - 错误:文件未在此范围内声明
- c++ - CMake 没有为 g2o 设置变量
- kernel-extension - 端点安全 - 阻止用户以写入模式打开文件
- c - 信号处理程序在线程中不起作用
- wpf - 将 Datagrid 分成 2 部分
- jmeter - JMeter 脚本 - 不下载 png、jpg、woff
- c++ - c ++重新初始化静态常量成员
- reactjs - 安装 react-router-dom 时出错 npm install 问题