2013-07-08 2 views
0

Я хочу разработать пакет, но застрял с частью модели Eloquent. У меня есть пакет в инструментальных средствах, как workbench/vendor/workbench/src/modelsLaravel 4, модель в пакете верстака, Красноречивый не найден

Мои модели подобны

<?php namespace Vendor\Shop\Models; 

/** 
* A catalog 
*/ 
class Catalog extends \Eloquent { 

    // Define the database 
    protected $table = 'catalogs'; 

    // Mass assignment restriction 
    protected $fillable = array('name'); 

} 

?> 

Моя проблема является импорт красноречивым пространства имен, который не является то, что собственно я предполагаю, потому что если я запускаю UnitTest с PHPUnit он просто терпит неудачу с Class 'Eloquent' not found

Это из-за автозагрузки в композиторе? Выписка из файла композитора:

"require" : { 
    "php" : ">=5.3.0", 
    "illuminate/support" : "4.0.x", 
    "illuminate/database": "4.0.x" 
}, 
"autoload" : { 
    "classmap" : [ 
     "src/controllers", 
     "src/models", 
     "src/migrations", 
     "src/database/seeds" 
    ], 
    "psr-0": { 
     "Vendor\\Shop" : "src/" 
    } 
}, 
+0

Я думаю, что это потому, что он импортирует только часть поддержки подсветки. – pfried

+0

i обновил запрос, но по-прежнему имеет ту же проблему. В документах всегда расширяется «Eloquent», но не «Eloquent \ Model», если я использую модель this работает, но почему это – pfried

ответ

2

Если тесты не работают из корня вашего проекта (где artisan есть), то они, скорее всего, не развернув приложение до запуска тестов. Это означает, что ни одна из псевдонимов, определенных в app/config/app.php, фактически не определена. Вот что такое Eloquent, это псевдоним, который указывает на Illuminate\Database\Eloquent\Model.

Здесь вы можете сделать несколько вещей.

  1. Используйте пакет под названием testbench. Я не использовал это, но из того, что могу сказать, зависит от всего репозитория laravel/framework. У меня смешанные чувства по этому поводу. Но, по сути, этот пакет выполняет настройку, аналогичную настройке вашего приложения Laravel во время тестов. Этот пакет может позволяет продолжить расширение Eloquent, хотя я не могу подтвердить это или отклонить.

  2. Продлить Illuminate\Database\Eloquent\Model напрямую. Это, вероятно, намного проще, поскольку вы уже зависеть от репозитория illuminate/database. Единственным недостатком здесь является то, что если вы отпустите этот пакет, и кто-то поменяет псевдоним Eloquent своим собственным пользовательским расширением Eloquent, то он не будет применяться к вашему пакету. Поскольку ваш пакет напрямую распространяется на Eloquent и не использует псевдоним, он не так гибкий.

В конце концов, это зависит от обстоятельств вашей упаковки. Если он просто будет использоваться вами внутри, то я, вероятно, поеду с вариантом 2. Если нет, попробуйте вариант 1, и если он не будет возвращен к варианту 2.

Надеюсь, это поможет.

+0

Мы будем использовать это внутренне, поэтому option2 подходит для меня. Но еще одно: я еще не смог запустить модульные тесты извне пакета (потому что вы сказали, что приложение не загружается). Если я хочу загружать приложение, я должен либо получить phpunit для загрузки теста пакета, либо загрузить приложение из тестового пакета? – pfried

+0

Да, ваши тесты нужно запускать из каталога пакетов (очевидно). Проблема здесь в том, что этот код в значительной степени изолирован от остальной части приложения. Если вы посмотрите файл 'phpunit.xml' из основного приложения, вы увидите, что он использует' bootstrap/autoload.php', а не 'vendor/autoload.php'. Вот где приложение Laravel загружается. Кроме того, тесты приложений расширяют 'TestCase' в' app/tests', который по очереди расширяет 'Illuminate \ Foundation \ Testing \ TestCase'. –

+0

Я просто добавил тестовый каталог в основной файл конфигурации. Я попытаюсь выполнить загрузку приложения в пакете, я думаю, это было бы лучшим решением, даже если бы лучшее решение было бы, если бы я не заботился об этом. Я видел, что многие пакеты вообще не используют тест, а отсутствие простоты затрудняет запись тестов. Спасибо! – pfried

0

Как упоминал Джейсон Льюис в комментариях, главная проблема здесь в том, где phpunit является начальной загрузкой. Если вы разрабатываете свой пакет Laravel в папке workbench со свежей установкой Laravel, достаточно с уверенностью предположить, что ваш пакет не является агностиком, а зависит только от Laravel.

По существу, не обязательно, чтобы модульные тесты выполнялись в каталоге пакета исключительно из всего остального. То есть, предполагая, что мы не беспокоимся о том, что какой-то процесс CI запутался, но, вероятно, есть некоторые обходные пути. Я исследую это немного больше.

Так что я выбрал третий вариант. Просто дополните тесты своего пакета от TestCase, как обычно.

class MyAwesomeTest extends TestCase {}

Затем в командной строке, cd в корень родительского проекта Laravel и запустить PHPUnit с каталогом верстака в качестве аргумента.

phpunit workbench/vender/my-package/tests/

Это будет выполнять все модульные тесты своего пакета, с родителем, таким образом самозагрузка Laravel в дает Вам доступ ко всей удивительному тестировании блока Laravel помощи вы привыкли.

+0

Мы сильно зависим от нашего CI, тесты должны быть несовместимыми с каталогом, когда я вывожу наш пакет из рабочего места, мы просто меняем каталоги include в нашем основном тестовом конфигурационном файле. я чувствую, что это самое простое решение для нас, хотя это не должно быть необходимым, но для идеи – pfried

Смежные вопросы