Руководство по PHPUnit показывает, что я могу использовать константы классов в аннотациях для @expectedExceptionCode, см. PHPUnit @expectedExceptionCode
Я пытаюсь использовать его в своей модели с пространством имен, которая начинается с Eloquent.
Когда я запускаю свои тесты, я получаю: «Неустранимая ошибка PHP: класс« Eloquent »не найден». Запуск приложения — это нормально, так что это зависит от юнит-тестов, не так ли?
Есть идеи?
namespace Foo\Models;
use \Eloquent;
class Bar extends Eloquent {
const ERRORCODE = 150;
...
}
class BarTest extends TestCase {
/**
* @expectedExceptionCode Foo\Models\Bar::ERRORCODE
*/
public function testFoobar()
{
$name = 'foobar';
Bar::findBarOrFail($name);
}
}
В целях разъяснения:
PHP Fatal error: Class 'Eloquent' not found in PathToProject/app/models/Bar.php
После комментария @ j-boschieros я получил приведенный выше код! Спасибо друг!
Однако, когда я провоцирую исключение в тесте контроллера, фатальная ошибка все еще происходит.
Даже если я использую пространства имен или нет.
use \Eleoquent;
use Foo\Models\Bar;
class TestController extends TestCase {
/**
* @expectedExceptionCode Foo\Models\Bar::ERRORCODE
*/
public function testStoreActionWithInvalidDatatyp ()
{
$this->call('POST', '/routeToException');
}
Мои модульные тесты заработали, когда я расширяю \ Illuminate \ Database \ Eloquent \ Model вместо Eloquent.
namespace Foo\Models;
use \Illuminate\Database\Eloquent\Model;
class Bar extends Model {
const ERRORCODE = 150;
...
}
Это отличается от Ларавел Док. Это все еще хорошо?
Класс» \Eloquent
на самом деле это псевдоним, который регистрируется во время выполнения фреймворком Laravel. Вы заставляете PHP анализировать файл класса модели до того, как эти псевдонимы были настроены, что приводит к сбою. Правильный подход к этому — просто избегать псевдонимов глобального пространства имен и использовать вместо них реальные имена классов (Illuminate\Database\Eloquent\Model
вместо Eloquent
в твоем случае). Вы можете найти список псевдонимов классов в app/config/app.php
,
Других решений пока нет …