TDD
the tests are usually mainly state-based – asserting values at the end of the test
use mock objects to set and verify expectations about how objects will interact. The state becomes a side-issue.
TDD code written in this way is characterized by narrow, well-named interfaces describing the roles objects play for one another.
Each “test method” takes the form of a sentence saying what the object should do.
Example
Story: Account Holder withdraws cash
As an Account Holder
I want to withdraw cash from an ATM
So that I can get money when the bank is closed
Using the given-when-then template, the first two scenarios might look like this:
Scenario 1: Account has sufficient funds
Given the account balance is $100
And the card is valid
And the machine contains enough money
When the Account Holder requests $20
Then the ATM should dispense $20
And the account balance should be $80
And the card should be returned
Scenario 2: Account has insufficient funds
Given the account balance is $10
And the card is valid
And the machine contains enough money
When the Account Holder requests $20
Then the ATM should not dispense any money
And the ATM should say there are insufficient funds
And the account balance should be $20
And the card should be returned
Scenario 3: Card has been disabled
Given the card is disabled
When the Account Holder requests $20
Then the ATM should retain the card
And the ATM should say the card has been retained
Scenario 4: The ATM has insufficient funds
