Модульное тестирование Drupal с DrupalUnitTestCase завершается неудачно при настройке базы данных - PullRequest
5 голосов
/ 18 мая 2011

Использование DrupalUnitTestCase для модульного тестирования модуля Drupal завершается неудачей.Я, наверное, что-то забываю.

Тест выполняется нормально, пока я не создам экземпляр некоторого класса:

$foo = new FooBar();

В этом случае Drupal решает применить магию и пытается вызвать базу данныхчтобы найти какой-то файл в его реестре.

 Test PDOStatement->execute() failed: <em class="placeholder">PDOException</em>: SQLSTATE[42S02]: Base table  [error]
or view not found: 1146 Table &#039;td_development.simpletest50921registry&#039; doesn&#039;t exist: SELECT
filename FROM {registry} WHERE name = :name AND type = :type; Array
(
    [:name] =&gt; FooBar
    [:type] =&gt; interface
)

DrupalUnitTestCase, в отличие от DrupalWebTestCase, не создавайте базу данных в соответствии с замыслом.Таким образом, причина, почему это не удается, ясна.

Однако я не хочу, чтобы Drupal просматривал базу данных, когда все, что мне нужно, - это создать какой-то экземпляр.Как избежать Drupal поиска файла в его реестре?

Ответы [ 2 ]

5 голосов
/ 18 мая 2011

Вы, вероятно, не можете.

Возможности использования UnitTestCase в качестве родительского класса очень ограничены. Как только вы сделаете все, что требует базы данных (а создание нового класса произойдет, потому что функции автозагрузки Drupal 7 зависят от базы данных), вам придется использовать WebTestCase.

Единственное, что может сработать, это явно включить все файлы, необходимые для работы этого класса. Потому что автозагрузка вызывается только в том случае, если класс еще не существует (также это может быть класс, который используется или зависит от вашего класса). Но это относительно хрупко, и вам всегда придется включать все эти файлы вручную в правильном порядке, что означает, что ваши модульные тесты зависят от внутренней работы вашего класса. Что тоже нехорошо.

0 голосов
/ 20 февраля 2013

Вы также можете попробовать это

spl_autoload_register('your_function');
if (function_exists('drupal_autoload_class')) {
  spl_autoload_unregister('drupal_autoload_class');
  spl_autoload_register('drupal_autoload_class');
  spl_autoload_unregister('drupal_autoload_interface');
  spl_autoload_register('drupal_autoload_interface');
}

Это переместит автозагрузку Drupal вниз и решит проблему.

...