【问题标题】:Private function error with PHPUnit testingPHPUnit测试的私有函数错误
【发布时间】:2016-06-12 10:07:39
【问题描述】:

我的 PHPunit 测试出现以下错误

Warning: Invalid callback Vc_Manager::__sleep, cannot access private method Vc_Manager::__sleep()

这是因为函数 __sleep() 是私有的,而类的 __contruct() 函数也是私有的。

如何在我的 phpunit 测试中使用该函数而不将函数公开?

完整代码:

require_once('../splitTestNew.php');



class SplitTestTest extends PHPUnit_Framework_TestCase
{


    public function setUp(){

    }
    public function tearDown(){ }
    /**
     * @runInSeparateProcess
     */
    public function testDefaultParameterValues()
    {

        $obj = new BSSplitTest();
        $this->assertTrue($obj->params['A'] == 50);
        $this->assertTrue($obj->params['B'] == 50);
        $this->assertTrue($obj->params['SplitCookieA'] == 'ACounter');
        $this->assertTrue($obj->params['SplitCookieB'] == 'BCounter');
        $this->assertTrue($obj->params['TableA'] == 'counter_a');
        $this->assertTrue($obj->params['TableB'] == 'counter_b');

    }

【问题讨论】:

  • 在测试我与应用程序中的其他模块共享代码的库时,我使用反射 (secure.php.net/manual/en/book.reflection.php) 来验证内部变量或函数进程,以确保我的库代码按预期工作。然后我的应用程序测试使用公共方法与库一起工作。

标签: php function class phpunit private


【解决方案1】:

如果你的构造函数是私有的,那么你就不能拥有

 $obj = new BSSplitTest();

这意味着你的构造函数是公共的,你需要一个静态工厂构造函数。

 $obj = BSSplitTest::getInstance(); //or createInstance if not singleton 

【讨论】:

    【解决方案2】:

    我们从不测试私有方法,这没有任何意义。您要么需要公开函数,要么测试使用私有方法的函数。

    另外,如果构造函数也是私有的,你首先需要创建一个类的实例(例如使用工厂模式),然后调用一个函数。

    【讨论】:

    • 私有函数本身没有被测试,但顶部所需的文件还包括用于查询帖子类型的文件 wp-load.php。这包含来自 wordpress 的 Visual Composer 插件的私有函数。因此无法将功能更改为公共
    猜你喜欢
    • 2016-05-21
    • 2011-10-30
    • 2016-01-30
    • 1970-01-01
    • 2016-06-04
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多