模拟类PHPUnit中

问题描述:

我终于进入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

当你创建一个错误类名对象此错误消息出现。检查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