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

代码有两个缺陷会妨碍测试:

  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
        }
    }   
}

这样,您可以用 Mock 或 Stub 替换您Data_Source返回定义的测试值。

如果这不是一个选项,请查看 Test Helper 扩展:

特别是看一下set_new_overload(),它可用于注册一个回调,该回调会在执行 new 运算符时自动调用。


¹ Test-Helper 扩展被https://github.com/krakjoe/uopz取代

于 2013-03-19T06:55:09.073 回答