2

我是 TDD 的新手。我被困在一些单元测试中......请看看我的代码......并提前感谢......

class Parser{

    protected function _checkCurlExistence()
    {
        // Unable to to mock function_exists, thats why fallback with this method

        return function_exists('curl_version');
    }


    public function checkCurlExtension()
    {

        // I want to test 2 situations from this method...
        // 1. if curl extension exists
        // 2. or when curl extension does not exists...throw error

        if($this->_checkCurlExistence() === false){

            try{
                throw new CurlException(); //Some curl error handler exception class
            }catch(CurlException $error){
                exit($error->getCurlExtensionError());
            }

        }

        return true;
    }
}

想测试:

class ParserTest{

    /**
    * @expectedException CurlException
    */
    public function testCheckCurlExtensionDoesNotExists()
    {
        //Some testing code with mocking...
    }

    public function testCheckCurlExtensionExists()
    {
       //Some testing code with mocking..and assertion 

    }

}

我的问题/要求:

请你填写这些测试。我永远被困在这上面……无法继续我的 TDD 之旅。

一些步骤(您可以跳过这些行):

我已经尽我所能自己解决这个问题,但无法这样做。有些步骤是..

我尝试了 phpunit 的原生mockery 、 padraic/mockery (git)、codeception/aspect-mock (git) 来模拟两种情况下的 _ checkCurlExistence()方法……我不确定我是否做得对……这就是为什么,不是发布那些代码...

我尝试了Reflection Api,类扩展,通过魔术方法__call()... 将受保护的方法动态转换为公共方法以帮助模拟...

我也做了很多谷歌搜索。了解最佳实践是仅测试公共方法。但是我的公共方法依赖于受保护的方法......所以我该如何测试???

4

1 回答 1

0

找到了一种通过PHPUnit 函数模拟器扩展来模拟 php 内置函数的方法

所以我现在可以轻松地测试这 2 个场景。

namespace 'myNameSpace';

class Parser{

    public function checkCurlExtension()
    {
        // I want to test 2 situations from this method...
        // 1. if curl extension exists
        // 2. or when curl extension does not exists...throw error

        if(function_exists('curl_version') === false){
            throw new CurlException(); //Some curl error handler exception class
        }

        return true;
    }


}

class ParserTest{

    private $parser;

    /**
    * @expectedException CurlException
    */
    public function testCheckCurlExtensionDoesNotExists()
    {
        $funcMocker = \PHPUnit_Extension_FunctionMocker::start($this, 'myNameSpace')
        ->mockFunction('function_exists')
        ->getMock();

        $funcMocker->expects($this->any())
        ->method('function_exists')            
        ->will($this->returnValue(false));

        $this->parser->checkCurlExtension(); 

    }

    public function testCheckCurlExtensionExists()
    {
       //we can do same here...please remember DRY...

    }
}
于 2013-10-17T22:38:02.670 回答