我在通过单元测试时遇到了麻烦。问题是set方法创建了索引,但我不知道如何返回true值。我真的不知道如何为这个特定的单元测试正确创建一个set方法。
<?php
class Config
{
private static $instance;
public static $config;
private static function load($data) {
$data = include('data.php');
static::$config = $data;
return static::$config;
}
// constructor
protected function _construct(){}
private function _clone(){}
private function _wakeup() {}
// function to get the instance config
public static function singleton(){
/**
* Returns single instance of this class
*
*/
if(Config::$instance === null) {
Config::$instance = new Config();
}
return Config::$instance;
}
public static function set ($setData, $flag = false) {
$instance = Config::$instance;
$instance->$setData = $setData;
if($instance->$setData) {
return $flag = true;
}else {
return $flag = false;
}
//return $instance->$setData = $setData;
}
}
这是我试图传递的测试
<?php
assert_options(ASSERT_ACTIVE, 1) and assert_options(ASSERT_BAIL, 1);
$config = Config::singleton();
assert($config === Config::singleton());
$config->set('foo', true);
assert($config['foo'] === true);
print "All Tests Passed\n";
非常感谢任何帮助。
答案 0 :(得分:2)
由于无法修改测试,要修复Cannot use object of type Config as array
,必须使Config
对象像数组一样运行。它需要2次更改:
ArrayObject
构造函数进行正确配置:class Config extends ArrayObject {
public function __construct() {
parent::__construct( array(), ArrayObject::ARRAY_AS_PROPS );
}
...
}
如果没有ARRAY_AS_PROPS
选项,您将收到错误Undefined index: foo
。
<强>替代强>
这通常是通过实施__set
,__get
,__isset
来完成的。和__unset
。
我们的想法是您访问配置元素,就像它们是字段一样,如:
$config->foo = 'bar'
在这种情况下,如果字段foo
不存在,PHP将调用$config->__set( 'foo', 'bar' )
。同样,如果您阅读该字段,则会调用__get( 'foo' )
。
有关详细信息,请参阅PHP Overloading。
这是更新后的测试:
<?php
require_once 'Config.php';
assert_options(ASSERT_ACTIVE, 1) and assert_options(ASSERT_BAIL, 1);
$config = Config::singleton();
assert($config === Config::singleton());
$config->foo = true;
assert($config->foo === true);
print "All Tests Passed\n";
这里是Config
课程,只做了一些修改:
$config
存储在public static
字段中,而是将其存储为private
字段。Config::set()
方法委托给$instance
。class Config
{
private static $instance;
private $config;
private static function load() {
$data = include('data.php');
static::$config = $data;
return static::$config;
}
// constructor
protected function __construct(){}
/**
* Returns single instance of this class
*/
public static function singleton(){
return self::$instance === null
? self::$instance = new Config()
: self::$instance;
}
public static function set($field, $value) {
return Config::$instance->$field = $value;
}
public function __set($field, $value ) {
$this->config[$field] = $value;
}
public function __get($field) {
return $this->config[$field];
}
public function __isset($field) {
return isset( $this->config[$field] );
}
public function __unset($field) {
unset( $this->config[$field] );
}
}