Классы автозапуска в PHPUnit с использованием Composer и autoload.РНР



я только что установил PHPUnit версии 3.7.19 Себастьяна Бергмана через Composer и написал класс, который я хотел бы модульный тест.



я хотел бы, чтобы все мои классы автоматически загружались в каждый модульный тест без использовать include или require в верхней части моего теста, но это оказывается сложно!



вот как выглядит моя структура каталогов (трейлинг / косая черта указывает на каталог, а не файл):




  • композитор.json

  • композитор.замок

  • композитор.фар

  • lib/

    • возвращение.php



  • тесты/

    • returningTest.php



  • поставщик/

    • bin/

      • phpunit



    • композитор/

    • phpunit/

    • symfony/

    • Автозагрузка.php




мой композитор.json включает в себя следующее:



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


мой возвращение.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 фатальная ошибка: класс 'Returning' не найден в
/files / code/php/db/tests / returningTest.php on строка 8




я заметил, что composer производства на vendor/autoload.php но не уверен, что это имеет отношение к моей проблеме.



кроме того, в некоторых других ответах на переполнение стека люди упоминали что-то об использовании PSR-0 в composer и The namespace команда в PHP, но я не был успешным в использовании любого из них.



пожалуйста, помогите! Я просто хочу автоматически загружать свои классы в PHPUnit, чтобы я мог просто использовать их для создания объектов не беспокоясь о include или require.





обновление: 14 августа 2013



теперь я создал проект с открытым исходным кодом под названием PHPUnit Скелет чтобы помочь вам встать и работать с PHPUnit тестирования легко для вашего проекта.

807   3  

3 ответов:

Ну, во-первых. Вам нужно сказать автозагрузчику, где найти php-файл для класса. Это делается, следуя стандарту PSR-0.

лучший способ-использовать пространства имен. Автозагрузчик ищет Acme/Tests/ReturningTest.php файл, Когда вы запросили Acme\Tests\ReturningTest класса. Есть некоторые большие учебники пространства имен там, просто поиск и чтение. Обратите внимание, что пространство имен не что-то, что вошло в PHP для автоматической загрузки, это то, что можно использовать для самозарядный.

Composer поставляется со стандартным загрузчиком PSR-0 (тот, что в vendor/autoload.php). В вашем случае вы хотите сказать автозагрузчику искать файлы в . Затем, когда вы используете 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

если вы помещаете файл конфигурации в другой каталог, вам нужно поместить путь к этому каталогу в команду с помощью .

[обновление 2] еще один более простой альтернативный подход заключается в использовании на composer.json (ссылка). Преимущество заключается в том, что вам не нужно поддерживать два прихлоп.php (один для prod, один для dev) только для того, чтобы автоматически загружать разные классы.

{
  "autoload": {
    "psr-4": { "MyLibrary\": "src/" }
  },
  "autoload-dev": {
    "psr-4": { "MyLibrary\Tests\": "tests/" }
  }
}

[обновление] ответ Wouter J является более полным. Но мой может помочь людям, которые хотят настроить автоматическую загрузку PSR-0 в tests/ папка.
Phpunit сканирует все файлы с помощью этот шаблон *Test.php. Поэтому нам не нужно загружать их самостоятельно. Но мы все еще хотим автоматически загружать другие поддерживающие классы под tests/ как приспособление / заглушка или некоторые родительские классы.

самый простой способ-посмотреть на то, как сам проект композитора является создание теста по PHPUnit. На самом деле все очень просто. Обратите внимание на строку с "bootstrap".

ссылка:https://github.com/composer/composer/blob/master/phpunit.xml.dist

<?xml version="1.0" encoding="UTF-8"?>

<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false"
         syntaxCheck="false"
         bootstrap="tests/bootstrap.php"
>
    <testsuites>
        <testsuite name="Composer Test Suite">
            <directory>./tests/Composer/</directory>
        </testsuite>
    </testsuites>

    <groups>
        <exclude>
            <group>slow</group>
        </exclude>
    </groups>

    <filter>
        <whitelist>
            <directory>./src/Composer/</directory>
            <exclude>
                <file>./src/Composer/Autoload/ClassLoader.php</file>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

ссылка: https://github.com/composer/composer/blob/master/tests/bootstrap.php

<?php

/*
* This file is part of Composer.
*
* (c) Nils Adermann <[email protected]>
* Jordi Boggiano <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

error_reporting(E_ALL);

$loader = require __DIR__.'/../src/bootstrap.php';
$loader->add('Composer\Test', __DIR__);

последняя строка выше-это автоматическая загрузка тестовых классов phpunit в пространстве имен Composer\Test.

ни один из этих ответов не был тем, что я искал. Да PHPUnit загружает тестовые файлы, но не заглушки/светильники. Ответ Чаун Ма не сокращает его, потому что работает vendor/bin/phpunit уже включает autoload, поэтому нет никакого способа получить экземпляр autoloader, чтобы подтолкнуть больше путей к его стеку в этот момент.

Я в конце концов нашел это в документах:

Если вам нужно искать один и тот же префикс в нескольких каталогах, вы можете указать их в виде массива, как такие:

{
    "autoload": {
        "psr-0": { "Monolog\": ["src/", "lib/"] }
    }
}

Comments

    Ничего не найдено.