如何使用XML文件为phpunit设置工作目录?

3
我正在查看文档,但是我没有看到任何更改运行测试时使用的工作目录选项。
我使用PhpUnit,因为它包含在Laravel中。我想能够从我的项目根目录运行vendor/bin/phpunit,并使用/public目录作为工作目录运行。
我尝试从/public运行../vendor/bin/phpunit,但由于phpunit.xml文件不在公共目录中,而且我不想每次都指定配置文件路径,所以这样做行不通。
是否可以向我的phpunit.xml文件添加一些内容,告诉它使用/public目录作为“cwd”(当前工作目录)来运行测试?

为什么?你想要达到什么目标? - brombeer
如果我不使用/public作为当前工作目录,我的测试就无效了,因为Laravel通常将public目录作为当前工作目录。(相对路径文件会出错)我知道使用Laravel的函数来获取应用程序根目录而不是使用相对路径可以解决这个问题...但是为了获得准确的结果,我应该使用与生产环境中使用的相同的当前工作目录。 - Skeets
public 不是 Laravel 的当前工作目录,而是服务器的 "DocumentRoot",即(web)应用程序的服务位置。您无法访问 public 中的任何类/命令。也许您需要重写您的测试? - brombeer
对于一个网页应用程序,“DocumentRoot”定义了Web服务器提供页面时的当前工作目录。如果我在我的web.php文件顶部放置dd(getcwd()),浏览器将显示公共目录是当前工作目录。从phpunit运行相同的web.php文件会产生不同的结果。也许我理解错了,但我认为phpunit的至少一个目标是复现在生产环境中发生的相同条件。我正试图为网页创建测试,而不是控制台命令。所以当前工作目录应该是public,以匹配代码在生产环境中运行时的情况。 - Skeets
诀窍是不要使用getcwd,那是一个反模式 :) - mrhn
1
你可以直接使用Laravel来测试网页:https://laravel.com/docs/master/http-tests。很抱歉,我无法完全理解你的需求(没有任何示例测试、结果等),对于无法提供帮助感到抱歉。 - brombeer
2个回答

2

嗯,你需要在PHP中实际执行chdir,但是你可以在XML中定义一个引导脚本(<phpunit bootstrap="./bootstrap.php">),并通过它来改变工作目录。

另外,你也可以在测试类中添加一个setUpBeforeClass函数来改变工作目录。


2

根据评论和文档的反馈,我得出以下结论:

  1. 很可能无法更改phpunit默认使用的cwd(在PhpStorm中可能可以,但在命令行中需要编写某种包装脚本)
  2. 依赖于从特定目录运行的代码不是一个好主意。

我的一个类中有一些代码,像这样:

$var = file_get_contents("../some_file.json");

这很好用——直到您尝试添加单元测试。Web服务器使用/public目录作为cwd,而phpunit将使用根目录运行。
与其试图强制phpunit始终使用特定的cwd/public),我决定最好从依赖于一致的cwd的代码中删除相对路径。因此,上面的行变成了:
$var = file_get_contents(base_path("some_file.json"));

我不想改变已经运行良好的生产代码来进行一些测试,但这个改变似乎微不足道。(而且这是一个改进)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接