如何加载我需要的文件? PHP
How do I load the file I need? PHP
虽然这可能是一个基本问题,但人们会假设使用 require_once
,它实际上比那个更复杂 - 至少对我而言。
我遇到的问题是我的项目结构很像 Java 中的包结构。我们如何使用全局名称 space。所以项目结构看起来像:
ProjectName/
ModuleOne/
Class.php
composer.json
tests/
phpunit.xml
bootstrap.php
Class_test.php
在上面的示例中,Class.php
将被实例化为:ProjectName\ModuleOne\Class();
现在的问题是我们如何设置我们的测试目录,因为 Class_test.php
将使用 Class.php
和任何其他依赖的 classes,我需要一些方法来允许我在我的测试中实例化,class 有问题。每当我尝试时,我都会收到一条错误消息,说它找不到我正在尝试实例化的有问题的 class。
虽然这可能是一种不寻常的做事方式,但该项目是这样的,每个模块都可以使用 composer 导出,并使用我们选择的名称space 自动加载到您的项目中,在这种情况下ProjectName
.
我似乎遇到的问题是我需要 tests/
目录之外的每个 class 自动加载并准备好,这样如果 Class.php
扩展任何其他目录class 那么当 Class.php
被调用时它会知道,"ok I need to go here to see if this other class exists as well."
现在每个模块都有一个 composer 文件,里面有类似的东西:
"autoload": {
"psr-0": {
"ProjectName\ModuleOne\": ""
}
},
那么我可以在 bootstrap.php 中使用它来自动加载整个模块以进行测试吗?
我不会尝试重新发明轮子,我会采用 composer 建议的包结构。
快速 google 搜索让我 link 这个博客 post:How to create a PSR-4 PHP package。它几乎描述了 composer 包的文件结构应该是什么样子以及如何设置和组织包的测试。
希望对您有所帮助。
编辑:
假设你有上面 post 中建议的结构,你需要做的就是告诉 phpunit 在哪里可以找到由 composer 创建的自动加载文件。如果您需要更复杂的 bootstrapping,您可以执行以下操作。创建文件 tests/bootstrap.php
并向其中添加以下内容:
require_once 'path/to/composer/autoload.php';
// Set up your stubs, mocks etc.
在您的 phpunit.xml 文件中,您需要将 phpunit 指向正确的 bootstrap 文件,例如:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="tests/bootstrap.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Nacho Test Suite">
<directory suffix=".php">./tests/</directory>
</testsuite>
</testsuites>
</phpunit>
或者你可以 运行 带有 --bootstrap
标志的 phpunit,例如:
vendor/bin/phpunit --bootstrap path/to/bootstrap.php
虽然这可能是一个基本问题,但人们会假设使用 require_once
,它实际上比那个更复杂 - 至少对我而言。
我遇到的问题是我的项目结构很像 Java 中的包结构。我们如何使用全局名称 space。所以项目结构看起来像:
ProjectName/
ModuleOne/
Class.php
composer.json
tests/
phpunit.xml
bootstrap.php
Class_test.php
在上面的示例中,Class.php
将被实例化为:ProjectName\ModuleOne\Class();
现在的问题是我们如何设置我们的测试目录,因为 Class_test.php
将使用 Class.php
和任何其他依赖的 classes,我需要一些方法来允许我在我的测试中实例化,class 有问题。每当我尝试时,我都会收到一条错误消息,说它找不到我正在尝试实例化的有问题的 class。
虽然这可能是一种不寻常的做事方式,但该项目是这样的,每个模块都可以使用 composer 导出,并使用我们选择的名称space 自动加载到您的项目中,在这种情况下ProjectName
.
我似乎遇到的问题是我需要 tests/
目录之外的每个 class 自动加载并准备好,这样如果 Class.php
扩展任何其他目录class 那么当 Class.php
被调用时它会知道,"ok I need to go here to see if this other class exists as well."
现在每个模块都有一个 composer 文件,里面有类似的东西:
"autoload": {
"psr-0": {
"ProjectName\ModuleOne\": ""
}
},
那么我可以在 bootstrap.php 中使用它来自动加载整个模块以进行测试吗?
我不会尝试重新发明轮子,我会采用 composer 建议的包结构。
快速 google 搜索让我 link 这个博客 post:How to create a PSR-4 PHP package。它几乎描述了 composer 包的文件结构应该是什么样子以及如何设置和组织包的测试。
希望对您有所帮助。
编辑:
假设你有上面 post 中建议的结构,你需要做的就是告诉 phpunit 在哪里可以找到由 composer 创建的自动加载文件。如果您需要更复杂的 bootstrapping,您可以执行以下操作。创建文件 tests/bootstrap.php
并向其中添加以下内容:
require_once 'path/to/composer/autoload.php';
// Set up your stubs, mocks etc.
在您的 phpunit.xml 文件中,您需要将 phpunit 指向正确的 bootstrap 文件,例如:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="tests/bootstrap.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Nacho Test Suite">
<directory suffix=".php">./tests/</directory>
</testsuite>
</testsuites>
</phpunit>
或者你可以 运行 带有 --bootstrap
标志的 phpunit,例如:
vendor/bin/phpunit --bootstrap path/to/bootstrap.php