1

私は単体テストの初心者であり、引数を持たない関数を持つ PHP クラス内にあるアルゴリズム (実際の実装では cron によって実行可能) をテストするのが困難であり、データ ソースの他のクラスに依存しています。これです:

class Mailing_System_Algo {     

    function __construct()
    {

        //Run the mailing system method    

        $this->execute_mailing_system();

    }

    function execute_mailing_system()
    {           

        $Class_Data_Source = new Data_Source;
        $groups = $Class_Data_Source->get_groups();

        //Proceed only if groups are defined
        if (!(empty($groups))) {
            //rest of the algo codes here-very long and lots of loops and if statements

        }
    }   

}

アルゴ関数をブラックボックスのように扱いたいので、テストを行うときにコードを変更することはありません。しかし、クラスがインスタンス化された瞬間に execute_mailing_system がすぐに実行される場合、入力を入力してテストを開始するにはどうすればよいでしょうか?

アルゴがグループの有無にかかわらず実行されるかどうかを確認したい場合、ユニット テスト コードで $groups の入力を提供するにはどうすればよいですか?

これは私のテストケースがどのように見えるかです:

class WP_Test_Mailing_System_Algo extends WP_UnitTestCase {

/**
 * Run a simple test to ensure that the tests are running
 */


function test_tests() {
            //no problem here
    $this->assertTrue( true );
}

function test_if_algo_wont_run_if_no_groups_provided {

            //Instantiate, but won't this algo run the construct function rightaway?
    $Mailing_System_Algo = new Mailing_System_Algo;

            //rest of the test codes here
            //how can I access or do detailed testing of execute_mailing_system() function and test if it won't run if groups are null or empty.
            //The function does not have any arguments

}

}

もちろん、私が作成するテストはたくさんありますが、現在、このテストに行き詰まっています。これは、実行する必要がある最初のテストです。しかし、私はこれを始める方法に問題があります。テクニックを正しく習得すれば、残りのテストは簡単になると思います。ご意見やご協力をいただければ幸いです..ありがとうございます。

4

1 に答える 1

2

コードには、テストを妨げる 2 つの欠陥があります。

  1. コンストラクターは実際の作業を行います
  2. ハードコーディングされた依存関係

クラスを次のように変更することで、これを改善できます。

class Mailing_System_Algo 
{     
    public function __construct()
    {
        // constructors should not do work
    }

    public function execute_mailing_system(Data_Source $Class_Data_Source)
    {           
        $groups = $Class_Data_Source->get_groups();

        //Proceed only if groups are defined
        if (!(empty($groups))) {
            //rest of the algo codes here-very long and lots of loops and if statements
        }
    }   
}

これは、あなたData_SourceMock または Stubに置き換えて、定義されたテスト値を返す方法です。

これができない場合は、Test Helper 拡張機能をご覧ください。

特に、set_new_overload()new オペレータの実行時に自動的に呼び出されるコールバックを登録するために使用できる を見てください。


¹ Test-Helper 拡張機能はhttps://github.com/krakjoe/uopzに置き換えられました

于 2013-03-19T06:55:09.073 に答える