16. Story: 标题 (描述故事的单行文字)
As a [角色]
I want [特征]
So that [利益]
(用一系列的场景来定义验证标准)
Scenario 1: 标题 (描述场景的单行文字)
Given [上下文]
And [更多的上下文]...
When [事件]
Then [结果]
And [其他结果]...
17. Story: 帐户持有人提取现金
As an [帐户持有人]
I want [从 ATM 提取现金]
So that [可以在银行关门后取到钱]
Scenario 1: 帐户有足够的资金
Given [帐户余额为 $100]
And [有效的银行卡]
And [提款机有足够现金]
When [帐户持有人要求取款 $20]
Then [提款机应该分发 $20]
And [帐户余额应该为 $80]
And [应该退还银行卡]
18. 在上面的例子中。我们定义了从提款机取款这个系统行
?
为,该行为由一系列的场景组成。例如第一个场景就是
用户帐户当前余额为$100,而用户要求取款$20。
As an 标识出这个系统行为是为哪一个角色而定义的,
?
这里是“帐户持有人”。
I want 和 So that 则指明了该角色想做的事,以及想
?
达到的目的。这三个短句定义了这个系统行为的参不者、
范围。
接下来每一个场景的 Given … When … Then 实际上
?
就是设定该场景的状态、适用的事件,以及场景的执行
结果。
22. $this->given('帐户余额为 100', function (& $world) {
// 由于 Account 对象必须属于一个 AccountHolder(帐户持有人),
// 因此需要构造一个 AccountHolder 对象
$account_holder = new AccountHolder();
$account_holder->name = 'tester';
// 创建一个 Account 对象,并设置余额为 $arguments[0]
$world['account'] = new Account($account_holder);
$world['account']->balance = 100;
})->and('有效的银行卡', function (& $world) {
$world['card'] = new CreditCard($world['account']);
$world['card']->valid = true;
})->and('提款机有足够现金', function (& $world) {
// 确保 ATM 的余额大于帐户余额
$world['atm'] = new ATM();
$world['atm']->balance = $world['account']->balance + 1;
})
23. ->when('帐户持有人要求取款 20', function (& $world) {
$world['account']->drawingByATM($world['atm'], $world['card'], 20);
})
->then('提款机应该分发 20', function (& $world, $action) {
$this->assertEquals(20, $world['atm']->last_dispense, $action);
})->and('帐户余额应该为 80', function (& $world, $action) {
$this->assertEquals(80, $world['account']->balance, $action);
})->and('应该退还银行卡', function (& $world, $action) {
$this->assertTrue($world['card']->isCheckedOut(), $action);
})
24. 有了测试代码,我们就可以编写实现代码,并在反复测试中验证
?
实现代码是否达到要求。实现代码丌大可能一次编写就通过测试,
那么在测试时,就会指出结果丌正确:
> phpunit --story AccountHolderWithdrawsCashSpec
PHPUnit 3.3.0beta1 by Sebastian Bergmann.
AccountHolderWithdrawsCashSpec
- Account has sufficient funds [failed]
帐户余额为 100
Given
有效的银行卡
and
提款机有足够现金
and
帐户持有人要求取款 20
When
提款机应该分发 20
Then
帐户余额应该为 80
and
应该退还银行卡
and
Scenarios: 1, Failed: 1, Skipped: 0, Incomplete: 0.
25. 可惜 PHPUnit 3.3 beta 1测试版使用故事模式没法
?
显示测试失败的具体方法。
所以我们要去掉 --stroy参数来运行 PHPUnit。
?
There was 1 failure:
1) AccountHasSufficientFunds(AccountHolderWithdrawsCashSpec)
帐户余额应该为 80