我有几个模块(DZP::Catalyst和DZP::OurPkgVersion)这两个模块的目的都是将文件写入磁盘。我不确定如何测试它们,是否有任何好的策略来测试写入磁盘的文件?我可以去读它的任何地方吗?
答案 0 :(得分:3)
好吧,在这种特殊情况下(Dist::Zilla插件),您将要使用Dist::Zilla::Tester。它负责创建临时目录,填充文件以及事后清理的大量繁琐工作。例如,请参阅the tests from my DZP::CJM或tests from Dist::Zilla itself,尤其是plugins directory。
更新: Dist :: Zilla 4.200002引入了Test::DZil模块,该模块添加了一些用于测试插件的实用功能。您可能希望使用它而不是直接使用Dist :: Zilla :: Tester。
答案 1 :(得分:3)
这取决于模块,但我的总体策略是:
确保文件内容逻辑100%独立 - 就不同方法而言 - 与文件机制(例如选择目录/打开文件/关闭文件/错误处理)。
确保文件功能100%灵活,例如您可以从外部驱动程序中选择目录/文件名。
编写文件机制的测试,只需打开指定目录中的指定文件,关闭它,确保没有错误发生且预期文件存在且大小为零
创建一个测试数据数组,该数组的每个元素由3部分组成
输入文件内容逻辑的数据,可能与测试配置相结合,指示文件内容逻辑中的哪些方法可以在保证的情况下调用该数据。
要设置的预期文件名
预期的文件内容,采用tar-balled预期文件的形式(具有确切预期内容的确切文件以及正确的预期名称)。
预期结果tarball应位于单独的子目录中(例如,测试脚本所在目录下的“expected_results”。
如果文件生成逻辑生成> 1文件,则需要tarball。
然后,在先前创建的测试数组中的每个测试上运行一个循环:
创建一个新的“实际结果”临时目录(或清理之前测试中的目录)
将模块中的目录设置为临时目录;将模块的文件名设置为测试信息中的预期文件名。
运行文件开启方法(先前已测试)
使用测试的逻辑方向(如果适用)和测试的输入数据从模块运行内容生成逻辑。
运行文件关闭方法(先前已测试)
创建“临时预期结果”临时目录(或清理上次测试中的目录)
将“预期结果”tarball从“expected_results”测试子目录复制到上一个项目符号点中创建的“temp expected results”临时目录
在“temp expected results”临时目录中解压缩tarball并从那里删除tarball。
目录 - 将“临时预期结果”临时目录与“实际结果”临时目录区分开(例如,确保两者具有100%相同的文件列表,并且每个文件的内容都是100%相同,可以通过本机Perl或通过diff
来电使用system()
。
由于上面的逻辑是非常通用的,我通常将其中的大部分抽象为一个“Test :: FileGenerator”模块,该模块被测试文件生成能力的所有单元和集成测试重用。