2011-10-24 11 views
3

PHPUnitを使用して私のPHPアプリケーションを単体テストし始めています。私は単体テストを単独で実行することが重要であるため、テストが失敗したときにどこを調べるかを知っています。私が理解しようとしていることの一つは、サブクラスを親から孤立してテストする方法です。たとえば、私のモデルのほとんどは、モデルが持たなければならない機能の大部分を持つ「ベースモデル」を拡張しています。ユニットテスト:サブクラスをその親から分離してテストする方法?

<?php 

class BaseModel 
{ 
    public function save($data) { 
     // write $data to the database 
     $dbAdapter->save($data); 
    } 
} 

class RegularModel extends BaseModel 
{ 
    public function save($data) { 
     // clean up $data before passing it to parent 
     if (isset($data['foo'])) { 
      unset($data['foo']); 
      $data['bar'] = 'foo'; 
     } 
     parent::save($data); 
    } 
} 

# Unit Test 
class RegularModelTest extends PHPUnit_Framework_TestCase 
{ 
    public function testSaveMethodCallsParent() { 
     $data = array('foo' => 'yes'); 
     $model = new RegularModel(); 
     $model->save($data); 
     // assert parent received data correctly 
    } 
} 

RegularModelをテストする方法がわかりません。不要なコードを呼び出さずに。私はまた、いくつかの自動読み込みをしていますので、親にsaveを呼び出すと、実際にテストデータベースに保存しようとします。私はRegularModelを私がBaseModelをテストしているときにテストしているときに、実際にデータベースに書き込むかどうか気にしないので、これをむしろ嘲笑したいと思います。あるいは、私はこれについてすべて間違っていると思いますか?このような状況をテストするときは、何をお勧めしますか?

答えて

2

RegularModelをテストするときは、$dbAdapterを偽ってください。あなたがまだ親クラスのコードを実行している間、そのコードは実際にはis-a関係のためRegularModelユニットの一部です。

唯一の方法は、BaseModelの別の実装を提供することです。これらのテストを別々のプロセスで実行するか、実行時に他の実装でスワップするためにRunkitを使用することができます。これらの両方には、複雑さ、性能の低下、および不安定性という欠点があります。これは、私の見解では高すぎる価格です。

1

定義上、サブクラスは密接にスーパークラスに結合されているため、実際にはサブクラスを単独でテストする方法はありません。

しかし、スーパークラスに渡される広範なテストスイートがある場合、通常、サブクラスに実装されているメソッドをカバーするだけで、サブクラスをテストできると確信することができます。スーパークラステストスイートは、スーパークラスの機能をカバーします。

関連する問題