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()。
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);
}
}
}
?>
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
评论列表