模拟类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;
}
当你创建一个错误类名对象此错误消息出现。检查getMock
方法通过完整类名与命名空间,如:
$settings = $this->getMock('Acme\DemoBundle\Model\Settings', array('getSettings'));
希望这有助于
编辑
的方法是静态的,PHPUnit的库不支持模拟静方法描述here和here。
因此,您可以使用一些模拟框架,如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));
}
@ matteo--谢谢!但现在它抱怨:'$ mock = $ settings-> getSettings();' – user101289
'中的'PHPUnit_Framework_MockObject_BadMethodCallException'确保您返回所需内容。手册在这里 - > https://phpunit.de/manual/current/en/test-doubles.html –
你好@ user101289你可以发布'getSettings'方法的代码吗? – Matteo
您可以发布测试方法的代码? – Matteo