我创建了一个包,它有一个函数,在本例中是myfunction(argument1, argument2),它只需要与参数长度相同的正输入。我想使用testthat包中的函数来测试输入的格式是否正确。这里的重点是,我想测试输入是否有资格成为函数的参数?
我有这样的东西:
test_that("myfunction works", {
input1 <- c(200, -220, 250)
input2 <- c(30, 40, 50)
myfunction(input1, input2)
expect_equal(length(input1), length(input2))
})
现在我想测试我所有的参数(input1, input2)是否只包含正数。我怎么能这么做呢?我试过了:
expect_true(input1[] > 0)
expect_true(input2[] >0)
和
expect_gt(input1[], 0)
expect_gt(input2[], 0)
,然后收到一个错误消息:
Error: Result of comparison must be a single logical value
似乎expect_…()家族函数只适用于单个值,而不是矢量或数据帧?有什么建议我应该试试吗?
您的示例有点不寻常,因为通常您会使用测试来检查函数的返回值是否满足某些假设,而不是您刚刚指定的输入值。正如它所写的,你没有检查任何关于函数是否实际工作的东西。
说到这里,你可以用:
myfunction <- sum
test_that("myfunction works", {
input1 <- c(200, -220, 250)
input2 <- c(30, 40, 50)
myfunction(input1, input2)
expect_true(all(input1>0))
})
#-- Failure (Line 6): myfunction works ------------------------------------------
#all(input1 > 0) is not TRUE
#
#`actual`: FALSE
#`expected`: TRUE
正确地失败了,因为不是所有的input1
都大于零。
作为通常如何使用期望的更具体的例子,如果您期望这些输入的函数应该返回单个数字,并且该值应该是350,那么您可以将测试编写为:
myfunction <- sum #The function you're writing
test_that("myfunction works", {
input1 <- c(200, -220, 250)
input2 <- c(30, 40, 50)
expect_true(length(myfunction(input1, input2)) == 1)
expect_equal(myfunction(input1, input2), 350)
})
这个关于测试的链接可能是有用的背景(尽管它是从包开发的角度编写的,但它的大部分内容对编写代码的任何人都很有用)。特别是12.2给出了一些例子
CRAN上沼气包中的checkArgClassValue()
功能(未导出)用于此类检查。你可以从这里复制:https://github.com/sashahafner/biogas/blob/master/R/checkArgClassValue.R。要使函数在实际参数不为正数时返回错误,可以添加以下内容:
checkArgClassValue(input1, expected.class = c('integer', 'numeric'), expected.range = c(0, Inf))
如果你想要一个警告,只添加warn.only = TRUE
。
关于如何使用它的其他示例,请参阅同一repo的R目录中定义的函数。