2016-06-20 67 views
1

有這個代碼如何單元測試一個PHP method_exists()

<?php 
public function trueOrFalse($handler) { 
if (method_exists($handler, 'isTrueOrFalse')) { 
    $result= $handler::isTrueOrFalse; 
    return $result; 
} else { 
    return FALSE; 
} 
} 

你會如何單元測試呢?有沒有機會嘲笑$handler?很顯然,我需要某種形式的

<?php 
$handlerMock= \Mockery::mock(MyClass::class); 
$handlerMock->shouldReceive('method_exists')->andReturn(TRUE); 

,但它不能做

+0

爲什麼你創建'trueOrFalse'方法你可以在代碼中檢查'method_exists',因爲如果方法存在'isTrue'並且總是返回'true',你可以簡單地將其替換爲單個'method_exists()',但是如果你使用方法'isTrue '你可以簡單的返回evrything數據'if(!method_exists)返回false'或者多個數據,或者你可以創建抽象類並將此方法設置爲parrenting的要求。附:對不起我的英語不好。 – Naumov

+0

這只是簡化。事實上'isTrue'返回布爾值(假或真)作爲其結果。所以問題是,是否有機會像現在這樣測試它,或者需要重構?在那種情況下,是的,我可能需要從方法 – user3350906

回答

3

好了在你的測試用例類,你需要用你的MyClass類相同的命名空間。訣竅是覆蓋當前命名空間中的內置函數。因此,假如你的類如下所示:

namespace My\Namespace; 

class MyClass 
{ 
    public function methodExists() { 
     if (method_exists($this, 'someMethod')) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

這裏是測試用例類應該怎麼樣子:

namespace My\Namespace;//same namespace of the original class being tested 
use \Mockery; 

// Override method_exists() in current namespace for testing 
function method_exists() 
{ 
    return ExampleTest::$functions->method_exists(); 
} 

class ExampleTest extends \PHPUnit_Framework_TestCase 
{ 
    public static $functions; 

    public function setUp() 
    { 
     self::$functions = Mockery::mock(); 
    } 
    /** 
    * A basic functional test example. 
    * 
    * @return void 
    */ 
    public function testBasicExample() 
    { 
     self::$functions->shouldReceive('method_exists')->once()->andReturn(false); 

     $myClass = new MyClass; 
     $this->assertEquals($myClass->methodExists(), false); 
    } 

} 

它的工作非常適合我。希望這可以幫助。

+0

中除掉'method_exists',對我來說也是如此,THX man! – user3350906