我有一个 test.php,我在其中运行单元测试用例。我想要的是
'include'
某些 .php 文件,但是当我这样做时,它们就会运行。例如,我只需要访问 .php 文件中的某些变量、函数,但整个 .php 文件都会运行。就我而言,.php 是一个巨大的文件。同样的事情也发生在'require'
。
是否可以在不运行的情况下访问这些 .php 方法、变量、函数?
谢谢!
这就是包含代码时发生的情况,它作为整个脚本的一部分执行。 您不会通过某些黑客来“修复此问题”,这些黑客会包含代码而不执行它。 您可以通过将代码组织成可调用单元来修复它。
事实上,单元测试是开始思考如何组织代码的一种很棒的方式。 你到底在测试什么? 一个班? 一个函数? 或者只是某个脚本中某个随机的顶级代码块?
如果是后者,您现在就看到了问题。 通过包含该代码,您可以执行它。 这超出了正在运行的测试的上下文。 相反,您希望该代码位于某种可调用单元中。 一个类,或者至少是一个函数。
例如,假设您有一个包含执行各种任务的顶级代码的 PHP 文件。 正如您所经历的,当您包含该代码时,所有这些任务都会立即执行。 但是,如果您将该文件中的代码组织成一组函数,那么通过包含它您所做的就是定义函数。 然后,使用代码(在本例中为单元测试)可以以受控且可预测的方式根据需要执行这些函数。
当您包含代码时,所有代码应该做的就是定义结构。 然后顶层使用代码应该使用这些结构。 将所有逻辑放入顶层代码使其变得不可测试且难以管理。
我得到了帮助。我要做的是创建一个新的 .php 文件,其中包含我要测试的所需函数和方法。
更新:似乎我需要重构我的代码,以便我从其他 .php 文件调用所需的函数和类。这样我就可以“包含”我想要的内容,而不会被执行。
谢谢大家的帮助。
您可以使用 get_included_files() 函数。这将为您提供已包含的文件列表。 然后你可以在你的代码周围加上一个“if”,这样就不会在包含时执行。
if (count(get_included_files() > 1)) {
echo "we are included in another script";
} else {
echo "we are standalone!";
}
参见 https://www.php.net/manual/en/function.get-included-files.php 附:在脚本中包含任何文件之前,您必须添加此代码。