php教程:php设计模式介绍之工厂模式(7)_PHP技巧_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

php教程:php设计模式介绍之工厂模式(7)

作者:黑客防线网安PHP教程基地 来源:黑客防线网安PHP教程基地 浏览次数:0

本篇关键词:模式工厂教程介绍
黑客防线网安网讯:  下面一个测试代码就是测试PropertyInfo类的:    functiontestPropertyInfo(){    $list=array(‘type’,’price’,’color’,’rent’);    $this->assertIsA(    $tes...
  下面一个测试代码就是测试PropertyInfo类的:
  
  functiontestPropertyInfo(){
  
  $list=array(‘type’,’price’,’color’,’rent’);
  
  $this->assertIsA(
  
  $testprop=newPropertyInfo($list),‘PropertyInfo’);
  
  foreach($listas$prop){
  
  $this->assertEqual($prop,$testprop->$prop);
  
  }
  
  }
  
  这个测试证明:每个PropertyInfo类都有四个公共属性而且具有按精确次序排列的叁数
  
  但是因为实例中RailRoad和Utility类并不需要颜色或者租用数据,所以我们需要测试PropertyInfo也能引入少量的参数而实例化为RailRoad和Utility类对象:
  
  functiontestPropertyInfoMissingColorRent(){
  
  $list=array(‘type’,’price’);
  
  $this->assertIsA(
  
  $testprop=newPropertyInfo($list),‘PropertyInfo’);
  
  $this->assertNoErrors();
  
  foreach($listas$prop){
  
  $this->assertEqual($prop,$testprop->$prop);
  
  }
  
  $this->assertNull($testprop->color);
  
  $this->assertNull($testprop->rent);
  
  }
  
  注:assertNoErrors()
  
  assertNoErrors()方法的作用是:证实没有PHP错误发生如果有错误,将不通过测试。
  
  assertNull()
  
  assertNull()方法的作用是:测试第一个参数是否为空。如果第一个参数不为空,将不通过测试。像大多数其他测试方法一样,你可以选择是否使用第二个叁数定义失败信息。
  
  为了满足前面的测试,PropertyInfo类定义为:
  
  classPropertyInfo{
  
  constTYPE_KEY=0;
  
  constPRICE_KEY=1;
  
  constCOLOR_KEY=2;
  
  constRENT_KEY=3;
  
  public$type;
  
  public$price;
  
  public$color;
  
  public$rent;
  
  publicfunction__construct($props){
  
  $this->type=
  
  $this->propValue($props,‘type’,self::TYPE_KEY);
  
  $this->price=
  
  $this->propValue($props,‘price’,self::PRICE_KEY);
  
  $this->color=
  
  $this->propValue($props,‘color’,self::COLOR_KEY);
  
  $this->rent=
  
  $this->propValue($props,‘rent’,self::RENT_KEY);
  
  }
  
  protectedfunctionpropValue($props,$prop,$key){
  
  if(array_key_exists($key,$props)){
  
  return$this->$prop=$props[$key];
  
  }
  
  }
  
  }
  
  现在PropertyInfo类可以构造各种不同的Property参数了。同时Assessor类可以提供数据来建立正确的PropertyInfo对象。
  
  现在以Assessor->$prop_info数组提供的数据为基础,新建一个实例化PropertyInfo的类。
  
  这样的代码可以是:
  
  classAssessor{
  
  protected$game;
  
  publicfunctionsetGame($game){$this->game=$game;}
  
  publicfunctiongetProperty($name){
  
  $prop_info=newPropertyInfo($this->prop_info[$name]);
  
  switch($prop_info->type){
  
  case‘Street’:
  
  $prop=newStreet($this->game,$name,$prop_info->price);
  
  $prop->color=$prop_info->color;
  
  $prop->setRent($prop_info->rent);
  
  return$prop;
  
  case‘RailRoad’:
  
  returnnewRailRoad($this->game,$name,$prop_info->price);
  
  break;
  
  case‘Utility’:
  
  returnnewUtility($this->game,$name,$prop_info->price);
  
  break;
  
  default://shouldnotbeabletogethere
  
  }
  
  }
  
  protected$prop_info=array(/*...*/);
  
  }
  
  这段代码实现了上述功能,但却非常脆弱。如果代入的值是$this->prop_info数组中没有的值,结果会怎样呢?因为PropertyInfo已经被实例化并被加入到Assessor代码中,没有有效的方法测试被产生的对象。比较好的解决就是:产生一个工厂方法使PropertyInfo对象更容易建立。因此,下一步将是写一个测试来实现Assessor类中的PropertyInfo方法。
  
  但是,有一个问题:这个方法不应该是Assessor类的公共接口(API)的一个部份。它能被测试吗?
  
  这里有两个方法,可以探究任何要求的合理数量的测试。简单的说,你可以运行黑匣子测试或白匣子测试。
  
  注:黑匣子测试(BlackBoxTesting)
  
  黑匣子测试就是:把被测试的对象当成"黑匣子",我们只知道它提供的应用接口(API),但不知道其到底执行了什么。它主要测试对象公共方法的输入和输出。
  
  白匣子测试(WhiteBoxTesting)
  
  白匣子测试和黑匣子测试恰恰相反,它假定知道测试对象中的所有代码信息。这种形式的测试是为了完善代码和减少错误。
  
  关于白匣子测试的详细说明请见:http://c2.com/cgi/wiki?WhiteBoxTesting。
  
  
    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-17364-1.html
网站维护教程更新时间:2012-09-21 05:17:27  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer