2017-06-14 28 views
1

很長時間的潛伏者 - 第一次海報。我剛開始使用PHP,並正在爲一些遺留代碼編寫一些測試。我在這裏有一門課,有特點。我如何測試該類在方法中使用特徵方法的方法?PHP單元測試類w /性狀

trait Cooltrait 
{ 
    public function extractMethod($z){ 
    return $z[0]; 
    } 
} 

class Awesome 
{ 
    using Cooltrait 

    public function handlesomething($x, $y){ 
    $var1 = $this->extractMethod($x) 

    if(!is_null($var1)){ 
     return true; 
    } 

    return false; 
    } 
} 

我需要測試$ var1是否爲null或不在類中,但我使用此特徵的方法。任何人都遇到過如何最好地模擬/存根一個類的特點,以測試hadlesomething函數在真棒類? (編輯澄清問題)。

回答

0

如果您正在測試Awesome,則可以假定該特徵是運行時的一部分。如果要單獨測試Cooltrait,則可以使用getMockForTrait

在這種情況下, 「我需要測試$ var1是否爲null」,它是前者 - 假設在測試時已經應用了該特徵。

注:的語法是use,而不是using

public function testVarIsNull() 
{ 
    $awesome = new Awesome; 
    $result = $awesome->handlesomething(array(null), 'not relevant in your example'); 
    $this->assertFalse($result); 

    $result = $awesome->handlesomething(array('valid'), 'not relevant in your example'); 
    $this->assertTrue($result); 
} 

由於extractMethod是公共的,你也可以測試方法隔離:

public function testExtractMethodShouldReturnFirstArrayEntry() 
{ 
    $awesome = new Awesome; 
    $this->assertSame('foo', $awesome->extractMethod(array('foo'))); 
} 

...或使用getMockForTrait

public function testExtractMethodShouldReturnFirstArrayEntry() 
{ 
    $cooltrait = $this->getMockForTrait('Cooltrait'); 
    $this->assertSame('foo', $cooltrait->extractMethod(array('foo'))); 
} 
+0

感謝羅比;我想測試Awesome類中的東西;我想將extractMethod結果的值從特徵更改爲特定值。任何想法如何可以嘲笑,而在真棒類測試handlesomething? 我沒有深入瞭解extractMethod在特徵中所做的全部細節,但假設它不僅僅返回數組的第一個值 – rl279

+0

如果您想模擬它,您可以部分模擬Awesome類,例如, '$ awesome = $ this-> getMockBuilder('Awesome') - > setMethods(array('extractMethod')) - > getMock();'then'$ awesome-> expect($ this-> once()) - >方法('extractMethod') - > willReturn('foobar');' - 然後用你的測試,例如'$ this-> assertTrue($ awesome-> handlesomething('whatever','...');' –

+0

這裏的關鍵在於特性已經在運行時應用到了Awesome,因此部分模擬與它相同如果真棒字面上擁有extractMethod方法 –