2012-02-22 2 views
1

オートローダを管理するプロジェクト内にクラスがあります。クラスの新しい各インスタンスは、autoload関数をSPL自動ロードスタックに追加し、インスタンスを設定解除すると、スタックから独自のインスタンスが削除されます。このクラスはまた、autoloadスタックから一時的に削除できるregister()メソッドとunregister()メソッドもエクスポートします。PHPUnit:自動ロードテストの問題でオートローダを無効にする

私はオートローダーの単体テストを作成しようとしていますが、いくつかの問題があります。 PHPUnitのブートストラップスクリプトにオートローダーを組み込むので、テスト中の他のクラスは通常の使用時と同じように自動ロードできます。オートローダユニットテストの間、この動作を無効にしたいのですが、通常のオートローダを無効にしないでユニットテストを行うことができますが、オートローダのインスタンスのためにユニットテストが合格しなかったかどうかはわかりません私がテストしているブートストラップまたはインスタンス。

私は、ブートストラップファイルに次のようにやってみました:私はこれが働くだろうと思ったが、残念ながらそれだけで投げる

namespace gordian\reefknot\autoload; 

use gordian\exampleclasses; 

/** 
* Test class for Autoload. 
* Generated by PHPUnit on 2011-12-17 at 18:10:33. 
*/ 
class AutoloadTest extends \PHPUnit_Framework_TestCase 
{ 
/** 
* @var gordian\reefknot\autoload\Autoload 
*/ 
protected $object; 

public function __construct() 
{ 
    // Disable the unit test autoloader for the duration of the following test 
    global $unitTestAutoloader; 
    $unitTestAutoloader -> unregister(); 
} 

public function __destruct() 
{ 
    // Restore normal autoloading when the test is done 
    global $unitTestAutoloader; 
    $unitTestAutoloader -> register(); 
} 

/** 
* Sets up the fixture, for example, opens a network connection. 
* This method is called before a test is executed. 
*/ 
protected function setUp() 
{ 
    $this -> object = new Autoload ('\\', 'gordian\exampleclasses', __DIR__ . '/exampleclasses'); 
} 

    // Unit tests go here 
} 

$unitTestAutoloader = new gordian\reefknot\autoload\Autoload(); 

、その後、私のユニットテストでは、次のコードを実装オートローダが他の単体テストのいずれに対しても機能していないため、すべての単体テストを実行するとエラーが発生します。

PHPUnitはすべてのテストを実行する前にすべての単体テストクラスを初期化し、オートローダテストクラスは他のテストクラスがテストするクラスをオートロードすることを妨げています。これは正しいです?

この問題を回避する方法はありますか?テスト・コンストラクタでデフォルト・オートローダーを何か他の方法で使用不可にすることはできますか?この場合のアドバイスをいただければ幸いです。

答えて

1

他のテストでオートローダーが動作しないのは、PHPUnitがテストを実行する前にすべてのテストケースインスタンスをインスタンス化し、それらを永久に保持するということです。デストラクタは、すべてのテストが実行された後にのみ実行されます。見つけたので、これらをsetUp()tearDown()に移動する必要があります。私はあなたの答えを最初に読んだとき、彼らがそうだったと思っていました。 :)

また、PHPUnitテストケースコンストラクタは、オーバーライドされたコンストラクタによって渡される必要があるパラメータ(少なくとも$name引数)を受け入れます。

0

私のオートローディングユニットテストでは、テストソースツリーにあるこれらのテストのためにいくつかのクラスを作成しました。テストディレクトリは実際のオートローディングに登録されていないので、それらを見つけることができません。

防弾テストを行う場合は、class_exists()を使用してクラスを正常にロードできないことを確認します。

function testAutoloadLoadsClass() { 
    self::assertFalse(class_exists('My_Test_Class'), 'Class should not load normally'); 
    self::assertTrue($this->fixture->autoload('My_Test_Class'), 'Class should load'); 
    self::assertTrue(class_exists('My_Test_Class'), 'Class should be loaded now'); 
} 

最初の行は、通常のオートローダーをトリガーする、そしてそれはあなたのテストクラスをロードするために失敗する必要があります。 2行目はテスト中のオートローダを使用します。 3行目は、実際にロードされたことを確認します。

+0

@GordonM - 通常のオートローダーを無効にするのを避けるには、 'class_exists()'を使うことができます。 –

+0

通常のオートローダーを無効にしたいので、テストオートローダーを単独でテストすることができます。 – GordonM

0

最終的には、通常のオートローダーをsetup()にし、コードをteartown()に再び有効にするコードを移動することを選択しました。完全なテストスイートが今はうまくいくようです。

関連する問題