文件导入导出模块的单元测试


unit test for a file import export module

我正在尝试为文件导入导出模块编写单元测试。

我的一个方法检查传递的文件名是否存在。

这将如何被嘲笑,并编写一个测试来检查文件是否存在?

单元测试应该证明一个代码单元在完全隔离中正确运行。如果您的测试依赖于文件系统正常运行才能通过,那么您的测试是次优的,并且在任何给定的测试运行中都可能对您撒谎。

就像任何实验一样,当你有多个变量时,你无法确定你的结果。对于与文件系统交互的PHP代码,最好使用自定义流包装器来模拟文件系统(通常是vfsStream,但如果你真的想写,你可以很容易地编写自己的流包装器)。

$noTest < $testWithFileSystemDependency < $testThatMocksFileSystem

通常,这是通过将文件路径传递给直接使用它们的方法来实现的:

<?php
function myFunction($someFilePath) {
    // do stuff
}

通过这种方式,您可以模拟文件系统,并传入一个可测试的虚拟路径,该路径将按照您模拟它的行为进行操作。

您编写了两个测试。一个创建文件并期望方法成功,另一个确保文件不存在并期望方法失败。

就我个人而言,我只是在tests目录中创建_files目录并在那里创建文件。或者在/tmp中。

有一种方法可以嘲笑fs:http://www.phpunit.de/manual/current/en/test-doubles.html#test-doubles.mocking-文件系统,但根据我的经验,我更喜欢真正的FS操作(在这种情况下)。