7. "As an evolving program is continually changed,
its complexity, reflecting deteriorating
structure, increases unless work is done to
maintain or reduce it."
— Meir Manny Lehman, 1980
14. What is refactoring?
"Refactoring is the process of changing a software system in such a
way that it does not alter the external behavior of the code yet
improves its internal structure."
— Martin Fowler
15. How do we ensure our code's
behaviour remains consistent?
16.
17. The purpose of our specs are to
describe the behaviour of a class
through examples.
18. PHPSpec is not about testing code
you've already written
30. # spec/Auth/UserSpec.php
function it_lets_us_disable_a_user()
{
$this->setActive(0)
->shouldBeAnInstance('AuthUser');
$this->shouldNotBeActive();
}
31. Our tests start to build up a picture
Command:
$ bin/phpspec run
32. Our tests start to build up a picture
Response:
> specAuthUser
✔ it generates an id
✔ it stores a username
✔ it does not allow spaces in usernames
✔ it lets us disable a user
5 examples (5 passed)
247ms
33. Our spec should provide just enough examples
to be confident we have clearly defined the
intended behaviour.
Only write specifications for edge cases if they
are behaviour we want to specify.
34. Lets throw in collaborations
A collaboration is the term for when our object
interacts with another object
36. If our object is interacting with an
external object (e.g. Roles), we need a
way of specifying those interactions.
So we create a fake object, called a double.
37. # spec/Auth/UserSpec.php
function it_stores_many_roles(Role $role1, Role $role2)
{
$this->addRole($role1);
$this->addRole($role2);
$this->getRoles()
->shouldHaveCount(2);
}
38. $role1 and $role2 may look fairly
normal, but they're actually doubles.
Meaning we can fake their behaviour.
42. PHPSpec will run the let and let_go
before and after running each
scenario
Meaning we can share common
stubbed behaviour between
scenarios
43. # spec/Auth/UserSpec.php
function let(Role $role)
{
$role->checkPermittedAreas(Argument::any())
->will(function($args) {
return $args;
});
}
function let_go() {
// Do any deconstruction here
}
44. PHPSpec is intended as a TDD tool
to help you design your code through
specifying it's behaviour.
But that doesn't mean we can't use it to re-design
existing code.
46. By specifying code behaviour, you
create an environment where
technical debt becomes managed.
You, and more importantly other developers,
can redesign and refactor with confidence.
48. Symfony2 bootcamp workshop
We're running a workshop on getting you
started with Symfony2 on 7th June.
Tickets are free but limited, so book your place
ASAP.
Link on our twitter - @vivaitld