9

検索しましたが、探しているものを見つけることができず、この点でマニュアルはあまり役に立ちません。私は単体テストにかなり慣れていないので、正しい軌道に乗っているかどうかはわかりません。とにかく、質問に。私はクラスを持っています:

<?php
    class testClass {
        public function doSomething($array_of_stuff) {
            return AnotherClass::returnRandomElement($array_of_stuff);
        }
    }
?>

さて、明らかに私はAnotherClass::returnRandomElement($array_of_stuff);毎回同じものを返したいと思っています。私の質問は、単体テストで、このオブジェクトをどのようにモックアップするのですか?

テストファイルの先頭に追加しようとしましたAnotherClassが、テストしたいときにAnotherClass「クラスを再宣言できません」というエラーが表示されます。

ファクトリ クラスは理解していると思いますが、このインスタンスでそれをどのように適用するかはわかりません。テストデータを含む完全に別のAnotherClassクラスを作成し、実際のAnotherClassの代わりにFactoryクラスを使用してそれをロードする必要がありますか? または、工場のパターンを使用しているのは単なるニシンです。

私はこれを試しました:

    $RedirectUtils_stub = $this->getMockForAbstractClass('RedirectUtils');

    $o1 = new stdClass();
    $o1->id = 2;
    $o1->test_id = 2;
    $o1->weight = 60;
    $o1->data = "http://www.google.com/?ffdfd=fdfdfdfd?route=1";
    $RedirectUtils_stub->expects($this->any())
         ->method('chooseRandomRoot')
         ->will($this->returnValue($o1));
    $RedirectUtils_stub->expects($this->any())
         ->method('decodeQueryString')
         ->will($this->returnValue(array()));

setUp() 関数で、しかしこれらのスタブは無視され、それが間違っているのか、それともメソッドへのアクセス方法に問題があるのか​​ わかりませんAnotherClass

ヘルプ!これは私を夢中にさせています。

4

1 に答える 1

6

単体テストでは、静的データを含む「テスト」クラスを作成し、それらをテスト対象のクラスに渡します。これにより、テストから変数が削除されます。

class Factory{
    function build()
    {
        $reader = new reader();
        $test = new test($reader);
        // ..... do stuff
    }

}

class Factory{
    function build()
    {
        $reader = new reader_mock();
        $test = new test($reader);
        // ..... do stuff
    }

}
class reader_mock
{
    function doStuff()
    {
        return true;
    }
}

静的クラスを使用しているためAnotherClass、プログラムから削除してから、テスト データを返す関数のみが含まれるように再作成する必要があります。ただし、通常は、実際にプログラムからクラスを削除したくないため、上記の例のようにクラスを渡します。

于 2009-08-12T16:46:28.723 に答える