我的项目中有以下结构:
/
/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
Run Code Online (Sandbox Code Playgroud)
使用app和lib目录,我有各种类可以一起运行我的应用程序.要设置我的测试,我创建了一个/tests/phpunit.xml文件和/tests/bootstrap.php
phpunit.xml
<phpunit bootstrap="bootstrap.php">
</phpunit>
Run Code Online (Sandbox Code Playgroud)
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');
Run Code Online (Sandbox Code Playgroud)
所以我有以下测试:
<?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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我进行测试时它找不到课程 - PHP Fatal error: Class 'app\models\UserTable' not found in /var/www/phpdev/tests/app/models/UserTableTest.php on line 13
我究竟做错了什么?我试图更好地理解PHPUnit配置,所以我选择自己编写配置和引导程序文件.
Raa*_*ghu 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();
Run Code Online (Sandbox Code Playgroud)
您可能应该使用composer来组织您的代码,例如,项目根目录中的composer.json应包含以下内容:
...
"autoload": {
"psr-0": {
"PRJ_NAME\\APP\\": "app/",
"PRJ_NAME\\LIB\\": "lib/"
}
},
...
Run Code Online (Sandbox Code Playgroud)
然后运行composer update后,上面定义的两个命名空间将被放入vendor/composer/autoload_namespaces.php中。接下来很简单,只需使用自动加载选项运行 phpunit 即可,如下所示:
phpunit --bootstrap vendor/autoload.php tests/app/models/UserTableTest
Run Code Online (Sandbox Code Playgroud)
确保在源代码和测试代码中更改命名空间的使用。
如果您在应用程序中使用相同的引导程序加载类,您应该能够在测试中加载它们。如果您通过 cd 运行测试到您的测试目录中,只需添加到您的 phpunit.xml 中:
<testsuite name="My Application Tests">
<directory>./</directory>
</testsuite>
Run Code Online (Sandbox Code Playgroud)
里面<phpunit></phpunit>