Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 我们如何测试非';在构建R包时,t是否暴露?_Unit Testing_R_Tdd - Fatal编程技术网

Unit testing 我们如何测试非';在构建R包时,t是否暴露?

Unit testing 我们如何测试非';在构建R包时,t是否暴露?,unit-testing,r,tdd,Unit Testing,R,Tdd,我目前正在为R开发一个应用程序。我们正在尝试使用和的原理(TDD)。但是,我们遇到了一个概念上的问题 如何测试未公开的函数? 考虑下面的简化示例Outer()是我们在中构建的一个函数,我们通过在文件中列出它来向用户公开它internal()是一个短(~5行)实用函数: Outer <- function(...) { Inner <- function(...) { return(x) } return( Inner() ) } OuterIMO这里没有问题

我目前正在为R开发一个应用程序。我们正在尝试使用和的原理(TDD)。但是,我们遇到了一个概念上的问题

如何测试未公开的函数? 考虑下面的简化示例
Outer()
是我们在中构建的一个函数,我们通过在文件中列出它来向用户公开它
internal()
是一个短(~5行)实用函数:

Outer <- function(...) {

  Inner <- function(...) {
    return(x)
  }

  return( Inner() )
}

OuterIMO这里没有问题——Inner只是Outer的一个不可分离的部分,所以测试Outer测试Inner。您愿意测试匿名函数吗?这里也一样。

如果
内部
实现了您想要测试的非平凡功能,我建议将
内部
移动到顶层,但不要导出它。通常,我避免将函数嵌套在其他函数中正是因为这个原因——它们很难测试


您可以在开发过程中使用通常的testthat函数进行测试,因为您可能只是在寻找所有R代码的来源,而不必担心名称空间(至少我是这样开发的)。然后将
R CMD check
test\u-package
结合使用,以确保测试在构建时仍然有效-
test\u-packages
在包命名空间中运行测试,以便它们可以测试非导出函数。

如果内部函数实际上仅在代码中为外部函数定义,我相信只有在调用Outer时才会创建这些。所以我认为没有办法测试这些。对于其他非嵌套但非导出的函数,应该可以通过getAnywhere等进行测试。请解释一下选项3中“项目的目标状态”是什么意思?我将分解这些内部函数,但不在API中公开它们(即不将函数导出到名称空间)。因此,您可以记录和测试它们,并且仍然有一个干净的API。@Andrie-这是一个很好的问题;我不清楚。我们的一个解决方案涉及到你建议的伪版本。我们会故意中断
Outer()
(比如注释掉它的函数声明)以强制
Inner()
函数为顶级函数。稍后,我们将取消注释这些行。对我来说,这感觉像是从目标状态移开,因为这意味着现在故意破坏一个公开的函数,并且在我们构建之前必须记得稍后再次破坏它。您的一般建议更像模型1:还是模型2:?另外,对于这两种模型,我需要在我的构建脚本或/tests文件中编写/包含什么来确保测试代码可以执行Inner()函数?好的,我想我已经解决了。在顶层将类似的函数聚合到一个文件中可能是最简单的方法。然后,我可以使用一个脚本来调用
library(testthat)
,获取包含函数的文件,并为每个测试文件调用
test\u file()
。很抱歉是的,请参阅github上的我的devtools包,以获取自动化该功能的功能process@hadley你有一个简单的例子,我可以看看吗?在我的例子中,非导出函数是非常重要的。移动的部分比典型的匿名函数多,因此测试是有用的。