2015-06-26 6 views
1

Я начал добавлять модульные/функциональные тесты к устаревшему Laravel 4.2 webapp с помощью phpunit, и я вижу странную ошибку, когда используется DB::table ,Тестирование Laravel 4.2 с помощью phpunit DB :: table() -> get() возвращает массивы, а не объекты

Вот очень простой пример: тест попадает в метод контроллера, который вызывает DB::table, затем умирает и выгружает результат.

class ExternalFormTest extends TestCase { 

    public function testGetExternalFormThankYouPage() 
    { 
     $response = $this->call('GET', 'test'); 

Это метод управления.

public function getIndex() 
{ 
    $results = DB::table('users')->get(); 
    dd($results); 

Это возвращает массив массивов.

..array(12) { 
    [0] => 
    array(74) { 
    'id' => 
    int(1) 
    [0] => 
    int(1) 
    'account_number' => 
    int(1000) 
    [1] => 
    int(1000) 
    'account_admin' => 
    int(1) 

Но если я ударил его своим браузером.

И я получаю массив объектов ...

array (size=12) 
    0 => 
    object(stdClass)[1967] 
     public 'id' => int 1 
     public 'account_number' => int 1000 
     public 'account_admin' => int 1 
     public 'user_type' => int 1 

Это вызывает кучу ошибок на протяжении всего приложения. Поскольку код ожидает доступа к свойствам (то есть $individual_result->id), но результатом являются массивы. Я пробовал это с sqlite в памяти и обычной базой MySql. Является ли это ошибкой или мне не хватает чего-то о том, как Laravel возвращает результаты и/или как работает phpunit.

Любые предложения были бы полезными.

Это мой файл phpunit.xml.

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit backupGlobals="false" 
    backupStaticAttributes="false" 
    bootstrap="bootstrap/autoload.php" 
    colors="true" 
    convertErrorsToExceptions="true" 
    convertNoticesToExceptions="true" 
    convertWarningsToExceptions="true" 
    processIsolation="false" 
    stopOnFailure="false" 
    syntaxCheck="false" 
> 
    <testsuites> 
     <testsuite name="Application Test Suite"> 
      <directory>./app/tests/</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 

ответ

3

Режим выборки настраивается с помощью клавиши «выборки» в файле config/database.php. Это должно быть PDO::FETCH_CLASS. Возможно, у вас установлено значение PDO::FETCH_ASSOC для тестовой среды? В качестве обходного пути, вы можете попробовать установить его непосредственно в контроллере, чтобы увидеть, если это будет решить:

public function getIndex() 
{ 
    DB::connection()->setFetchMode(PDO::FETCH_CLASS); 
    $results = DB::table('users')->get(); 
    dd($results); 
} 

Если это работает, то это просто вопрос выяснить, где она становится установлен FETCH_ASSOC.

+0

Это работает. Поиск проекта Единственное место, где отображаются PDO :: FETCH_ASSOC или PDO :: FETCH_CLASS, находится под вендором \ doctrine, vendor \ laravel и vendor \ symfony ... поэтому я не думаю, что это проблема локальных настроек. Огромное спасибо за помощь. –

0

Не имеет значения, используете ли вы на phpunit или внутри своих контроллеров. Поведение (предположительно) должно быть одинаковым.

Вы также используете метод -> get() на (я полагаю) ваш контроллер для отображения результата в вашем браузере?

Насколько я знаю с laravel, -> get() действительно должен возвращать результаты в виде массива.

+0

Насколько я могу судить -> get() возвращает массив объектов в типичном использовании. Я не могу понять, почему это не во время тестирования. В документах «Как необработанные запросы метод get возвращает массив результатов, где каждый результат является экземпляром объекта PHP StdClass. Вы можете получить доступ к значению каждого столбца, обратившись к столбцу как свойство объекта:« –

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

  • Нет связанных вопросов^_^