当前位置: 首页 > 面试题库 >

使用Composer和autoload.php在PHPUnit中自动加载类

海雪松
2023-03-14
问题内容

我刚刚通过Composer安装了Sebastian Bergmann的PHPUnit版本3.7.19,并编写了一个我想进行单元测试的类。

我想将所有类都自动加载到每个单元测试中, 不必使用它include或将其require放在测试的顶部,但这证明很困难!

这是我的目录结构的样子(后跟/斜杠表示目录,而不是文件):

  • composer.json
  • composer.lock
  • composer.phar
  • lib /
    • returning.php
  • tests/
    • returningTest.php
  • 供应商/
    • 箱/
    • phpunit
    • vendor/
    • phpunit /
    • symfony /
    • autoload.php

我的 composer.json 文件包括以下内容:

"require": {
    "phpunit/phpunit": "3.7.*",
    "phpunit/phpunit-selenium": ">=1.2"
}

我的 returning.php 类文件包括以下内容:

<?php
class Returning {
    public $var;
    function __construct(){
        $this->var = 1;
    }
}
?>

我的 returningTest.php 测试文件包括以下内容:

<?php
class ReturningTest extends PHPUnit_Framework_TestCase
{
    protected $obj = null;

    protected function setUp()
    {
        $this->obj = new Returning;
    }

    public function testExample()
    {   
        $this->assertEquals(1, $this->obj->var);
    }

    protected function tearDown()
    {

    }
}
?>

但是,当我从命令行运行时./vendor/bin/phpunit tests,出现以下错误:

PHP致命错误:在第8行的/files/code/php/db/tests/returningTest.php中找不到类“ Returning”

我注意到composer生成了一个autoload.php文件,vendor/autoload.php但不确定是否与我的问题有关。

另外,在有关的其他一些答案中,人们提到了有关在composer中使用PSR-0和namespace在PHP中使用命令的一些知识,但是我都没有成功使用这两个方法。

请帮忙!我只想在PHPUnit中自动加载我的类,这样我就可以使用它们来创建对象而无需担心includeor require

更新:2013年8月14日

现在,我已经创建了一个名为PHPUnit Skeleton的开源项目,以帮助您轻松地为项目启动并运行PHPUnit测试。


问题答案:

好吧,一开始。您需要告诉自动加载器在哪里可以找到类的php文件。这是通过遵循PSR-0标准来完成的。

最好的方法是使用名称空间。Acme/Tests/ReturningTest.php当您要求Acme\Tests\ReturningTest上课时,自动装带器将搜索文件。有一些很棒的名称空间教程,只是搜索和阅读。请注意,namespacing
并不是 PHP可以自动加载的东西,而是可以用于自动加载的东西。

Composer带有标准的PSR-0自动装带器(中的一个vendor/autoload.php)。对于您的情况,您想告诉自动装带器在lib目录中搜索文件。然后,当您使用ReturningTest它会寻找/lib/ReturningTest.php

将此添加到您的composer.json

{
    ...
    "autoload": {
        "psr-0": { "": "lib/" }
    }
}

文档中有更多信息。

现在,自动加载器可以找到您需要的类,让PHPunit知道在运行测试之前要执行的文件:引导文件。您可以使用该--bootstrap选项指定引导文件的位置:

$ ./vendor/bin/phpunit tests --bootstrap vendor/autoload.php

但是,最好使用PHPunit配置文件:

<!-- /phpunit.xml.dist -->
<?xml version="1.0" encoding="utf-8" ?>
<phpunit bootstrap="./vendor/autoload.php">

    <testsuites>
        <testsuite name="The project's test suite">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>

</phpunit>

现在,您可以运行命令,它将自动检测配置文件:

$ ./vendor/bin/phpunit

如果将配置文件放入另一个目录,则需要在带有-c选项的命令中将该目录的路径放入。



 类似资料:
  • 我刚刚通过Composer安装了塞巴斯蒂安·伯格曼(Sebastian Bergmann)的PHPUnit版本3.7.19,并编写了一个我想进行单元测试的类。 我想让我的所有类自动加载到每个单元测试中,而不必在测试的顶部使用或,但事实证明这很困难! 这就是我的目录结构(尾随/斜杠表示目录,而不是文件): composer.json returningTest.php bin/ phpUnit 我的

  • 这篇文章是对 PHP自动加载功能 的一个总结,内容涉及 PHP自动加载功能 、PHP命名空间、PSR0/PSR4标准 等内容。 一、PHP 自动加载功能 PHP 自动加载功能的由来 在 PHP 开发过程中,如果希望从外部引入一个 Class ,通常会使用 include 和 require 方法,去把定义这个 Class 的文件包含进来。这个在小规模开发的时候,没什么大问题。但在大型的开发项目中,

  • 似乎composer在运行post install命令时无法加载psr-4类。 这是我的composer.json: 包含: 运行输出: 生成自动加载文件Composer脚本\Composer脚本::postInstall 类存在:bool(false) PHP致命错误:在第19行的 /var/www/project/ComposerScript.php中找不到类模块\公共\服务\路由器服务 从a

  • 我遇到了使用作曲家psr-4自动加载功能和PHPUnit的问题。问题发生在我的本地机器以及TravisCI版本上。单元测试无法找到我的类,而普通脚本可以找到。 当然,任何配置都有问题,但我无法找出我做错了什么。提前感谢你的帮助。 这是我的项目文件结构: 公共/ src/ http/ urlhelper。php 小黑 超文本传输协议/ urlhelper.test.php 这是我的作曲家的作品。js

  • Laravel版本5.6 我正试图通过“自动加载”下的文件将一些类添加到我的项目中。 Composer.json 每当我执行时,两个文件都会出现错误,表示找不到文件。 PHP警告:未捕获错误异常:require(C:\laravel projects\project\vendor\composer/./../app/helpers/dbUsers.PHP):无法打开流:C:\laravel pro

  • 我有一个项目结构: 在index.php我创建2个新对象: 我的Test.php 我的App.php 我的自动加载对象在composer.json: 在index.php中成功创建了对象测试,但在创建新应用程序时,出现错误: 致命错误:未捕获错误:在第8行的/home/denis/Coding/xuborxcms/public/index.php中找不到类'Xuborx\Cms\App' 此外,当