My slides on PHPSpec 2 from Symfony November Camp Stockholm.
www.symfony.se/november-camp/
More Domain-Driven Design related content at: https://domaincentric.net/
48. IDENTITY MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_is_a_great_movie()
{
$this-‐>getRating()-‐>shouldBe(5);
$this-‐>getTitle()
-‐>shouldBeEqualTo('Star
Wars');
$this-‐>getReleaseDate()
-‐>shouldReturn(233366400);
}
}
49. COMPARISON MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_is_great_movie()
{
$this-‐>getRating()-‐>shouldBeLike('5');
}
}
50. THROW MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_does_not_allow_negative_ratings()
{
$this
-‐>shouldThrow('InvalidArgumentException')
-‐>duringSetRating(-‐3);
}
}
51. THROW MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_does_not_allow_negative_ratings()
{
$this-‐>shouldThrow(
new
InvalidArgumentException(
"Invalid
rating”
)
)-‐>during('setRating',
array(-‐3));
}
}
52. TYPE MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_is_a_movie()
{
$this-‐>shouldHaveType('Movie');
$this-‐>shouldReturnAnInstanceOf('Movie');
$this-‐>shouldBeAnInstanceOf('Movie');
$this-‐>shouldImplement('Movie');
}
}
53. OBJECT-STATE MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_is_available_on_cinemas()
{
$this-‐>shouldBeAvailableOnCinemas();
}
}
!
class
Movie
{
public
function
isAvailableOnCinemas()
{
return
true;
}<?php
}
54. OBJECT-STATE MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_has_a_soundtrack()
{
$this-‐>shouldHaveSoundtrack();
}
}
!
class
Movie
{
public
function
hasSoundtrack()
{
return
true;
}
}
55. COUNT MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_has_one_director()
{
$this-‐>getDirectors()-‐>shouldHaveCount(1);
}
}
56. SCALAR MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_has_a_string_as_title()
{
$this-‐>getTitle()-‐>shouldBeString();
}
!
function
it_has_an_array_as_cast()
{
$this-‐>getCast()-‐>shouldBeArray();
}
}
57. INLINE MATCHER
class
MovieSpec
extends
ObjectBehavior
{
function
it_has_default_options()
{
$this-‐>getOptions()-‐>shouldHaveKey('username');
}
!
public
function
getMatchers()
{
return
[
'haveKey'
=>
function($subject,
$key)
{
return
array_key_exists($key,
$subject);
}
];
}
}
65. SET UP & TEAR DOWN
class
CinemaSpec
extends
ObjectBehavior
{
/**
*
@param
BoxOffice
$boxOffice
*/
function
let($boxOffice)
{
$this-‐>beConstructedWith($boxOffice);
}
!
function
letGo()
{
$this-‐>tellPeopleToGoHome();
}
}
68. THREE RULES OF TDD
1.
2.
3.
WRITE NO PRODUCTION CODE EXCEPT
TO PASS A FAILING TEST
WRITE ONLY ENOUGH OF A TEST
TO DEMONSTRATE A FAILURE
WRITE ONLY ENOUGH PRODUCTION
CODE TO PASS A TEST
69. 4 RULES OF SIMPLE DESIGN
1.
2.
3.
4.
Passes all the tests
Express every idea we need to
express
Contains no duplication
Minimized the number of classes,
methods and other moving parts