2015-07-03 81 views
2

我終於進入PHP單元測試(總好過從來沒有耶!)模擬類PHPUnit中

我有一個Utility類做了一些事情,包括認證用戶的對web服務的訪問。 Utility::authenticate方法需要一個Settings對象,其中包含由authenticate檢查的用戶名等。

所以在我的測試中,我嘲笑一個Settings對象是這樣的:

$settings = $this->getMock('Settings', array('getSettings')); 

$settings->method('getSettings') 
    ->willReturn([ 
     'USERNAME' => 'testuser', 
     'SERVER' => 'testserver' 
    ]); 

$mock = $settings->getSettings(); 

到目前爲止好,但是當我試圖嘲弄對象傳遞給authenticate它拋出一個錯誤:

$this->assertEquals($testvalue, Utilities::authenticate($settings)); 
Argument 1 passed to Utilities::authenticate() must be an instance of Settings, instance of Mock_Settings_d0361624 given 

如何模擬Settings對象,使其看起來像Utilities類的「真實」對象?

編輯添加的getSettings功能:

class Settings { 

private $settings; 
private static $instance; 

public function __construct(){ 
    $configfile = "config/config.ini"; 
    //if(!$this->settings = parse_ini_file($configfile, true)){ 
     //die('SETTINGS OBJECT NOT FOUND OR COULD NOT BE PARSEd'); 
    //} 
} 
/** 
* @return Settings 
*/ 
public static function getSettings(){ 
    if (!self::$instance){ 
     self::$instance = new Settings(); 
    } 
    if(!utilities::authenticate(self::$instance)) die('AUTHENTICATION FAILED-- CHECK API KEY'); 
    return self::$instance; 
} 
+0

您可以發佈測試方法的代碼? – Matteo

回答

1

當你創建一個錯誤類名對象此錯誤消息出現。檢查getMock方法通過完整類名與命名空間,如:

$settings = $this->getMock('Acme\DemoBundle\Model\Settings', array('getSettings')); 

希望這有助於

編輯

的方法是靜態的,PHPUnit的庫不支持模擬方法描述herehere

因此,您可以使用一些模擬框架,如Phake,支持模擬靜態方法,如here所述。作爲工作示例:

public function test_authenticate() 
{ 
    $settings = \Phake::mock('Acme\DemoBundle\Model\Settings'); 

    \Phake::whenStatic($settings) 
     ->getSettings() 
     ->thenReturn([ 
      'USERNAME' => 'testuser', 
      'SERVER' => 'testserver' 
     ]); 

    $mock = $settings->getSettings(); 

    $testvalue = true; 
    $this->assertEquals($testvalue, Utilities::authenticate($settings)); 
} 
+0

@ matteo--謝謝!但現在它抱怨:'$ mock = $ settings-> getSettings();' – user101289

+0

'中的'PHPUnit_Framework_MockObject_BadMethodCallException'確保您返回所需內容。手冊在這裏 - > https://phpunit.de/manual/current/en/test-doubles.html –

+0

你好@ user101289你可以發佈'getSettings'方法的代碼嗎? – Matteo