我正在使用一个可生成php文件的重构工具。这些生成的文件也可以包含变量,函数和类。
我想编写单元测试,以测试那些文件是否按预期工作,但是我不知道该怎么做。
如果我要求使用的文件不正确if (! @require('my_new_file.php') ) {,我仍然会遇到解析错误,无法捕获。
我require在函数内调用,但所需文件中的定义在函数外仍然可用。我该如何避免呢?是否可能需要在范围内的文件,因此它不会污染全局名称空间?
即使我eval(file_get_contents('my_new_file.php'))在函数内部调用,在其中定义的函数my_new_file.php也是全局可用的。
函数和类始终在周围的名称空间中定义,不会改变这一点,因为它是一种语言功能。您可以将名称空间注入到生成的文件中,以防止它们污染其他名称空间,这将使名称冲突不再成为问题。
除此之外,您可以通过流程将测试代码与测试代码隔离。一种方法是pcntl_fork(),如果可用的话,或者exec()作为平庸的替代品。您的测试框架可能会提供另一种方法(我相信 PHPUnit 有类似的东西!),以便清理或保护全局名称空间。