2017-05-23 72 views
0

我測試了一個名爲City的類,它接受兩個參數,在這個類中我有一個返回修剪/過濾字符串的名字getter。注入一個驗證類實例到單元測試 - phpunit

問題

如果我想使用一個自定義的驗證類,我將不得不通過構造函數注入它。我將不得不在我的測試中創建一個真實的對象。

問題

  • 我應該創建一個驗證對象,並把它傳遞給市級在我的測試?因爲我不能使用這個模擬。

  • 我打破單元測試隔離在這裏?

市級注入驗證類

class City 
{ 
    protected $name; 
    protected $shortCode; 
    protected $customValidation; 


    public function __construct($name, $shortCode, CustomValidation $customValidation) 
    { 
     $this->name = $name; 
     $this->shortCode = $shortCode; 
     $this->customValidation = $customValidation; 

    } 

    public function name() 
    { 
     return $this->customValidation->trimmed_no_special_characters($this->name); 

    } 
} 

測試

class City 
{ 
    protected $name; 
    protected $shortCode; 

    public function __construct($name, $shortCode) 
    { 
     $this->name = $name; 
     $this->shortCode = $shortCode; 
    } 

    public function name() 
    { 
     return preg_replace('/[^A-Za-z]/', '', trim($this->name)); 
    } 
} 

市級注射驗證課後

測試

class CityTest extends TestCase 
{ 

    protected $city; 

    public function setUp() 
    { 

     $this->city = new City('Dubai', 'DXB', new CustomValidation('Dubai')); 

    } 
} 
+0

爲什麼你不能使用模擬? –

+0

,因爲城市類中的名稱getter使用方法進行驗證,我不知道該怎麼做,或者如果我可以使用模擬 –

回答

0

只是嘲笑必要的方法:

$validate = $this 
    ->getMockBuilder(CustomValidation::class) 
    ->disableOriginalConstructor() 
    ->getMock(); 

$validate 
    ->expects($this->once()) 
    ->method('trimmed_no_special_characters') 
    ->will($this->returnValue('some trimmed name)); 

你也可以做一個方法的模擬,通過在
鏈接需要一個特定的輸入這個電話: ->with($this->equalTo('something'))

+0

[從PHPUnit 5.4.0開始,getMock()方法已被棄用。請使用createMock()](https://github.com/sebastianbergmann/phpunit/wiki/Release-Announcement-for-PHPUnit-5.4.0) –

+0

@NikitaU。在'MockBuilder'上調用'getMock()'(在示例代碼中),而不是在'TestCase'上調用。 –

+0

對不起,您的評論不真實 –