我正在使用testthat包来测试更大的存储库中的R包.我想测试R包外的文件内容.
我可以在测试时引用位于R包外的文件吗?
可重现的示例可以下载为MyRepo.tar.gz
我的存储库名为"myRepo",它包含一个R包,"myRpkg"和一个充满各种脚本的文件夹
~/MyRepo/
~/MyRepo/MyRpkg
~/MyRepo/Scripts
Run Code Online (Sandbox Code Playgroud)
"MyRpkg"中的测试位于/tests/文件夹中
~/myRepo/myRpkg/tests/test.myscript.R
Run Code Online (Sandbox Code Playgroud)
我希望能够在Scripts文件夹中测试文件:
~/MyRepo/Scripts/myscript.sh
Run Code Online (Sandbox Code Playgroud)
我想阅读脚本来测试第一行的内容,做这样的事情:
check.script <- readLines("../../../Scripts/myscript.sh")[1]
expect_true(grepl("echo", check.script))
Run Code Online (Sandbox Code Playgroud)
如果我从MyRepo目录开始,这可以正常工作:
cd ~/MyRepo
R CMD check MyRpkg
Run Code Online (Sandbox Code Playgroud)
但如果我移动到另一个目录,它会失败:
cd
R CMD check MyRepo/MyRpkg
Run Code Online (Sandbox Code Playgroud)
正如它在R-exts中所说的那样
将目录测试复制到检查区域,并将测试作为工作目录运行,并设置R_LIBS以确保库(pkg_name)找到测试期间安装的软件包的副本.
默认情况下,将在当前目录中创建检查目录.因此,R CMD check从运行时~/MyRepo,test目录被复制到~/MyRepo/MyRpkg.Rcheck/tests并因此
check.script <- readLines("../../../Scripts/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)
被解释为
check.script <- readLines("~/MyRepo/Scripts/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)
按要求.然而从开始~/意味着
check.script <- readLines("~/Scripts/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)
这不是你想要的.解决方法是指定创建检查目录的目录,即
R CMD check -o MyRepo MyRepo/MyRpkg
Run Code Online (Sandbox Code Playgroud)
这样复制的tests目录与原始tests目录具有相同的"祖父" .
不过,我想知道为什么文件必须在包外面.如果要在包测试中使用该文件,则将该文件包含在包中是有意义的.您可以创建一个inst目录并将Scripts目录放在那里,以便在安装时将Scripts目录复制到包目录中,然后
check.script <- readLines("../foo/Scripts/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)
可以在测试脚本中使用,因为在R CMD检查期间将包安装在MyRpkg.Rcheck/foo中.或者,您可以创建一个exec目录并将脚本文件放在那里,然后
check.script <- readLines("../foo/exec/myscript.sh")[1]
Run Code Online (Sandbox Code Playgroud)
会工作.由于这两种解决方案只需要在测试期间找到安装的软件包,因此从哪里运行R CMD检查无关紧要.有关详细信息,请参阅包中的Package子目录和Non-R脚本.