PHPUnit - 测试中的自动加载类

时间:2014-08-09 14:50:01

标签: php phpunit

我的项目中有以下结构:

/
/app
/app/models/ --UserTable.php

/lib
/lib/framework
/lib/framework/Models
/lib/framework/Db

/tests -- phpunit.xml, bootstrap.php
/tests/app
/tests/app/models --UserTableTest.php

使用app和lib目录,我有各种类一起工作来运行我的应用程序。要设置我的测试,我创建了一个/tests/phpunit.xml文件和/tests/bootstrap.php

phpunit.xml

<phpunit bootstrap="bootstrap.php">
</phpunit>

bootstrap.php中

<?php

function class_auto_loader($className)
{
  $parts = explode('\\', $className);
  $path = '/var/www/phpdev/' . implode('/', $parts) . '.php';

  require_once $path;
}

spl_autoload_register('class_auto_loader');

所以我有以下测试:

<?php

class UserTableTest extends PHPUnit_Framework_TestCase
{
  protected $_userTable;

  public function setup()
  {
    $this->_userTable = new app\models\UserTable;
  }

  public function testFindRowByPrimaryKey()
  {
    $user = $this->_userTable->find(1);

    $this->assertEquals($user->id, 1);
  }
}

但是当我运行测试时它找不到类 - PHP Fatal error: Class 'app\models\UserTable' not found in /var/www/phpdev/tests/app/models/UserTableTest.php on line 13

我做错了什么?我正在尝试更好地理解PHPUnit配置,所以我选择自己编写配置和引导程序文件。

4 个答案:

答案 0 :(得分:26)

如果您使用的是composer autoload

更改

<phpunit colors="true" strict="true" bootstrap="vendor/autoload.php">

<phpunit colors="true" strict="true" bootstrap="tests/autoload.php">

并在tests目录中创建包含以下内容的新autoload.php

include_once __DIR__.'/../vendor/autoload.php';

$classLoader = new \Composer\Autoload\ClassLoader();
$classLoader->addPsr4("Your\\Test\\Namespace\\Here\\", __DIR__, true);
$classLoader->register();

答案 1 :(得分:4)

您可能应该使用composer来组织代码,例如,项目根目录中的composer.json应包含以下内容:

  ...
  "autoload": {
    "psr-0": {
      "PRJ_NAME\\APP\\": "app/",
      "PRJ_NAME\\LIB\\": "lib/"
    }
  },
  ...

然后在运行composer update之后,将上面定义的两个名称空间放入vendor / composer / autoload_namespaces.php中。接下来很简单,只需使用自动加载选项运行phpunit,如下所示:

phpunit --bootstrap vendor/autoload.php tests/app/models/UserTableTest

确保在源代码和测试代码中更改命名空间的用法。

答案 2 :(得分:1)

如果您在app中使用相同的引导程序加载classess,则应该能够在测试中加载它们。如果您正在通过cd运行test到您的测试目录中,只需添加到您的phpunit.xml:

<testsuite name="My Application Tests">
    <directory>./</directory>
</testsuite>

内部<phpunit></phpunit>

答案 3 :(得分:1)

在我的 loader (非常接近你的)中,我检查类名的第一个爆炸部分是否是我的供应商,如果它不是加载程序只是返回什么都不做(否则与 phpunit loader 有问题,因为我是 phpunit 的新手并且不要不知道这是否是预期的行为,也不知道 phpunit 建议或提供 loader 准备好使用了。)

我将phpunit.xml保留在tests/(不在其中)的同一目录中,一旦配置<directory>tests</directory>,我只需在命令行上运行phpunit,而无需配置或目录选项。