注意:所有代码在没有phpunit的情况下正常工作
文件1:common.php:
public function setNIMUID( $NIMUID ) {
if(is_bool(Cache::get("$NIMUID"))) {
$user_Array=array("_JID"=>(string)$NIMUID);
Cache::set("$NIMUID",$user_Array);
}
$this->NIMUID=(string)$NIMUID ;
}
文件2:memcache.class.php
方法1:
protected function __construct(array $servers) {
if(!$servers) {
trigger_error('No memcache servers to connect', E_USER_WARNING);
}
for($i = 0, $n = count($servers); $i<$n; ++ $i) {
($con = memcache_connect(key($servers[$i]), current($servers[$i])))&&$this->mc_servers[] = $con;
}
$this->mc_servers_count = count($this->mc_servers);
if(!$this->mc_servers_count) {
$this->mc_servers[0] = null;
}
}
方法2:
static function get($key) {
return self::singleton()->getMemcacheLink($key)->get($key);
}
方法3:
static function singleton() {
//Write here where from to get the servers list from, like
global $memcache_servers;
self::$instance||self::$instance = new Cache($memcache_servers);
return self::$instance;
}
文件3:commonTest.php
public function testCommon()
{
$Common = new Common();
$Common->setNIMUID("saurabh4");
}
$ memcache_servers变量:
$memcache_servers = array(
array('localhost'=>'11211'),
array('127.0.0.1'=>'11211')
);
错误:
Fatal error: Call to undefined function memcache_connect()
答案 0 :(得分:2)
单元测试应该是可重复的,快速的和隔离的。这意味着您不应该连接到外部服务来对您的类进行单元测试。 如果你想测试Common工作正常,你应该测试它的行为,在这种情况下就是你正在调用Cache类。
为此,you'll need to use mocks。使用模拟,您可以设置一些期望,例如以特定方式调用对象。如果您的类按预期调用了memcached类,则可以假设您的功能正常工作。你怎么知道Cache类工作正常?因为Cache类会有自己的单元测试。
为了使用模拟(或存根),你需要改变编程的方式,避免像Cache :: set()中那样的静态calles。相反,您应该使用类实例和普通调用。怎么样?将Cache实例传递给Common类。这个概念叫做Dependency injection。您的通用代码如下所示:
public function __construct( $cache ) {
$this->cache = $cache;
}
public function setNIMUID( $NIMUID ) {
if(is_bool($this->cache->get("$NIMUID"))) {
$user_Array=array("_JID"=>(string)$NIMUID);
$this->cache->set("$NIMUID",$user_Array);
}
$this->NIMUID=(string)$NIMUID ;
}