PHPUnit的模拟对象getMock()函数用法示例!

jackxiang 2008-10-14 15:49 | |
由于在我们代码开发中,网网接口调用平凡,但是现实资源往往也不足,为此,在我们的测试过程中也出现了困难,一方面是时间的对等,另一方面来自于开发进度和先关准备资源的不充分,为此,phpunit库早已为我们准备好了,getMock函数来跳过或者模拟一些接口方法:
以下假设update函数是掉外网的一个接口,但是这个时候,外网的接口还没有写好,我们怎么办才好呢?那就getMock吧!

helloworld.php
<?php
class helloworld
{
  public function helloworld()
  {
    echo "hello the world!";
    
  }
  public function update($arra)
  {
    return $arra;
  }
  
  public function update_next_do($arra)
  {
    
    if($this->update($arra)=='foos')
    {
      return foos;
    }else{
      return false;
    }
    
  }
  
  
  
}
?>


自动生成helloworldTest.php


<?php

require_once 'helloworld.php';

require_once 'PHPUnit/Framework/TestCase.php';

/**
* helloworld test case.
*/
class helloworldTest extends PHPUnit_Framework_TestCase {
  
  /**
   * @var helloworld
   */
  private $helloworld;
  
  /**
   * Prepares the environment before running a test.
   */
  protected function setUp() {
    parent::setUp ();
    
    // TODO Auto-generated helloworldTest::setUp()
    

    $this->helloworld = new helloworld(/* parameters */);
  
  }
  
  /**
   * Cleans up the environment after running a test.
   */
  protected function tearDown() {
    // TODO Auto-generated helloworldTest::tearDown()
    

    $this->helloworld = null;
    
    parent::tearDown ();
  }
  
  /**
   * Constructs the test case.
   */
  public function __construct() {
    // TODO Auto-generated constructor
  }
  
  /**
   * Tests helloworld->helloworld()
   */
  public function testHelloworld() {
    // TODO Auto-generated helloworldTest->testHelloworld()
    //$this->markTestIncomplete ( "helloworld test not implemented" );
    
    //$this->helloworld->helloworld(/* parameters */);
    $this->assertTrue($this->helloworld->update('foo')=='foo'); ////假如接口真实存在直接可以调用,来什么返回什么
    $this->assertFalse($this->helloworld->update('foo')=='foos');
    //以下开始构造虚拟接口class helloworld   function update('foo') return foos;    
    $observer = $this->getMock('helloworld', array('update'));
    
        // 设定update()方法的期望值为只被以字符串“something”为参数调用一次。
        $observer->expects($this->any())
                 ->method('update')
                 ->with($this->equalTo('foo'))
                 ->will($this->returnValue('foos'));

        // 创建一个Subject对象并附上模拟的Observer对象。
        $this->assertTrue($observer->update('foo')=='foos');//虚拟接口变为:输入foo返回foos了
        $result = $observer->update('foo');//虚拟接口变为:输入foo返回foos了
        $this->assertTrue($this->helloworld->update_next_do($result)=="foos");//其余真实方法去调用(虚拟接口)以达到预期结果
    
        
    
  
  }
    

}



注意:在里面多次执行了getMock模拟函数update(),我们用了any(),如果我们用once()的话,在调用第二次这个虚拟函数肯定会出错,因为once()限定了,相关匹配如下:


表 11.1. 匹配器
匹配器  含义
PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount any()  返回一个匹配器,当它评估的方法被执行0或多次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount never()  返回一个匹配器,当它评估的方法被从未被执行时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce atLeastOnce()  返回一个匹配器,当它评估的方法被至少执行一次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount once()  返回一个匹配器,当它评估的方法恰好被执行一次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedCount exactly(int $count)  返回一个匹配器,当它评估的方法正好被执行$count次时匹配。
PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex at(int $index)  返回一个匹配器,当它评估的方法在特定的$index上被调用时匹配。


关于:
            ->with($this->equalTo('foo'))
                 ->will($this->returnValue('foos'));
你要是传入多个变量的参数如(这样传):
                 ->with($this->equalTo('foo'),$this->equalTo('foo2'),$this->equalTo(array("one","two","three")))
                         ->will($this->returnValue(array("one return array","two  return array","three return array")));

这儿的with参数和will关系:
只有传入with的几个对应的参数,方能得到will的结果,但是你要是有引用什么的函数需要Mock的话:


    $friendObj = new Friend();
    $friendObj->getList($fuids,$uid,0,1,1000);
    var_dump($fuids); //你mock它,但是你传入的$fuids(假如一个数组),运行这儿是得不到的,注意啊!
    if(empty($fuids['uids']))
    {
      return 0;  
    }

为此:在需要通过mock的函数,请不要写为引用的格式,通过return 返回即可。
但你会说,要是有错误怎么办?
我建议通过php5的try catch 来实现,定义错误编号来解决这个问题,Tks.转帖请注明来自向东的博客:www.xiangdong.org/blog
                                    rewrite:xiangdong2    
                                                         2009-4-13






作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1305/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2009-4-13 18:23
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]