题
我是一名长期从事 PHP 项目的 Java 程序员,我正在尝试让 PHPUnit 启动并运行。在 Java 中进行单元测试时,通常将测试用例类和常规类放入单独的目录中,如下所示 -
/src
MyClass.java
/test
MyClassTest.java
等等。
使用 PHPUnit 进行单元测试时,是否通常遵循相同的目录结构,或者是否有更好的方法来布局测试类?到目前为止,我能让“include("MyClass.php")”语句正常工作的唯一方法是将测试类包含在同一目录中,但我不想在推送时包含测试类生产。
解决方案
我认为将文件分开是个好主意。我通常使用这样的文件夹结构:
/myapp/src/ <- my classes
/myapp/tests/ <- my tests for the classes
/myapp/public/ <- document root
在您的情况下,为了将类包含在测试文件中,为什么不将整个路径传递给 include 方法呢?
include('/path/to/myapp/src/MyClass.php');
或者
include('../src/MyClass.php');
其他提示
您需要修改PHP的include_path,以便它知道在哪里可以找到MyClass.php include()
它在你的单元测试中。
您可以在测试文件的顶部有类似的内容(在包含之前):
set_include_path(get_include_path() . PATH_SEPARATOR . "../src");
这会附加您的 src
目录到包含路径中,并且应该允许您将真实代码与测试代码分开。
根据我的经验,布莱恩·菲利普斯的回答还不够深入。当 PHPUnit 运行测试时,您不知道当前目录是什么。因此,您需要在 set_include_path() 表达式中引用测试类文件的绝对路径。像这样:
set_include_path(get_include_path() . PATH_SEPARATOR .
dirname(__FILE__) . "/../src");
该片段可以放置在其自己的头文件 SetupIncludePath.php 中,并包含在带有“require_once”的测试文件中,以便测试套件不会多次附加路径。
我将测试用例放在源文件的旁边,该文件具有相同的名称,但扩展名为 .phpt。当部署脚本推送到生产环境时,部署脚本只是过滤掉 *.phpt。
不隶属于 StackOverflow