[转]PHPUnit 测试代码,case结构的测试方法

jackxiang 2008-10-13 18:14 | |
D:\Program Files\Zend\Zend Studio for Eclipse - 6.0.1\plugins\com.zend.php.phpunit_6.0.1.v20080601\resources\library\PHPUnit\Samples\Money

object getMock($className, [array $methods, [array $arguments, [string $mockClassName, [boolean $callOriginalConstructor, [boolean $callOriginalClone, [boolean $callAutoload]]]]]])  
       返回一个用于指定的$className的模拟对象(见第 11 章)。缺省地,给定类的所有方法都是模拟的。当提供第二个(可选)参数时,只有名字出现在数组中的方法是模拟的。第三个(可选)参数持有参数数组,用于传入模拟对象的构造函数。第四个(可选)参数可用于为模拟对象指定类名。第五个(可选)参数可用于禁用对原始对象的__construct()方法的调用。第六个(可选)参数可用于禁用对原始对象的__clone()方法的调用。第七个(可选)参数可用于在模拟对象创建期间禁用__autoload()。
    <?php
    
require_once 'PHPUnit/Framework/TestCase.php';
    
    /**
    * 测试从账户中取现
    */
    class AccountHolderWithdrawsCashSpec extends PHPUnit_Extensions_Story_TestCase
    {
       /**
        * @scenario
        * 场景 1: 帐户有足够的资金
        */
       function AccountHasSufficientFunds()
       {
           $this->given('帐户余额为', 100)
                    ->and('有效的银行卡')
                    ->and('提款机有足够现金')
                ->when('帐户持有人要求取款', 20)
                ->then('提款机应该分发', 20)
                    ->and('帐户余额应该为', 80)
                    ->and('应该退还银行卡');
       }
    
       // ...
    
       /**
        * 处理 given
        */
       function runGiven(&$world, $action, $arguments)
       {
           switch($action)
           {
           case '帐户余额为':
               // 由于 Account 对象必须属于一个 AccountHolder(帐户持有人),
               // 因此需要构造一个 AccountHolder 对象
               $account_holder = new AccountHolder();
               $account_holder->name = 'tester';
               // 创建一个 Account 对象,并设置余额为 $arguments[0]
               $world['account'] = new Account($account_holder);
               $world['account']->balance = $arguments[0];
               break;
    
           case '有效的银行卡':
               $card = new CreditCard($world['account']);
               $card->valid = true;
               $world['card'] = $card;
               break;
    
           case '提款机有足够现金':
               // 确保 ATM 的余额大于帐户余额
               $world['atm'] = new ATM();
               $world['atm']->balance = $world['account']->balance + 1;
               break;
    
           default:
               {
                   return $this->notImplemented($action);
               }
           }
       }
    
       /**
        * 处理 when
        */
       function runWhen(&$world, $action, $arguments)
       {
           /**
            * 在 when 中调用对象的业务方法
            */
           switch($action)
           {
           case '帐户持有人要求取款':
               // 从指定提款机使用指定银行卡取出现金
               $world['account']->drawingByATM($world['atm'], $world['card'], $arguments[0]);
               break;
    
           default:
               return $this->notImplemented($action);
           }
       }
    
       /**
        * 处理 then
        */
       function runThen(&$world, $action, $arguments)
       {
           /**
            * 在 then 中验证业务对象的状态是否符合标准
            */
           switch($action)
           {
           case '提款机应该分发':
               // 验证提款机的余额
               $this->assertEquals($arguments[0], $world['atm']->last_dispense, "提款机应该分发 {$arguments[0]}");
               break;
    
           case '帐户余额应该为':
               // 验证帐户余额
              $this->assertEquals($arguments[0], $world['account']->balance, "帐户余额应该为 {$arguments[0]}");
              break;
  
          case '应该退还银行卡':
              // 验证银行卡没有被 ATM 锁定
              $this->assertTrue($world['card']->isCheckedOut(), '应该退还银行卡');
              break;
  
          default:
              return $this->notImplemented($action);
          }
      }
  }
?>

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


最后编辑: jackxiang 编辑于2008-10-14 14:47
评论列表
发表评论

昵称

网址

电邮

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