5

DrupalUnitTestCaseDrupal モジュールの単体テストに使用すると失敗します。私はおそらく何かを忘れています。

いくつかのクラスのインスタンスを作成するまで、テストは正常に実行されます。

$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
)

DrupalUnitTestCaseDrupalWebTestCase設計上、データベースを設定しないのではなく。したがって、これが失敗する理由は明らかです。

ただし、インスタンスを作成することだけが必要な場合に、Drupal がデータベースを検索することは望ましくありません。Drupal がレジストリでファイルを検索しないようにするにはどうすればよいですか?

4

2 に答える 2

5

あなたはおそらくできません。

UnitTestCaseを親クラスとして使用する可能性は非常に限られています。データベースを必要とする何かを行うとすぐに(そして、Drupal 7の自動ロード機能はデータベースに依存するため、新しいクラスを作成すると)、WebTestCaseを使用する必要があります。

動作する可能性がある唯一のことは、そのクラスが動作するために必要なすべてのファイルを明示的に含めることです。自動ロードは、クラスがまだ存在しない場合にのみ呼び出されるためです(クラスが使用または依存するクラスである可能性もあります)。ただし、これは比較的脆弱であり、これらすべてのファイルを常に正しい順序で手動で含める必要があります。つまり、単体テストはクラスの内部動作に依存します。どちらもいいことではありません。

于 2011-05-18T14:10:16.860 に答える
0

これを試すこともできます

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 オートロードが一番下に移動し、問題が解決されます。

于 2013-02-20T09:24:34.333 に答える