Upgrade to Pro — share decks privately, control downloads, hide ads and more …

It should! - BDD in practice

It should! - BDD in practice

How BDD helps you solve the murder on the Orient Express

Karol Sójko

June 17, 2013
Tweet

More Decks by Karol Sójko

Other Decks in Programming

Transcript

  1. MA'AM! CAN YOU TEST WHO YOU SAW? "What do you

    mean test? I can describe it if you like" - Ma'am ./bin/phpspec desc Suspect
  2. THE SUSPECTS "He was one of those types, you know"

    - Ma'am namespace spec\OrientExpress\Suspect; use PhpSpec\ObjectBehavior; use Prophecy\Argument; class SuspectSpec extends ObjectBehavior { function it_is_initializable() { $this->shouldHaveType('OrientExpress\Suspect\Suspect'); } }
  3. THE SUSPECTS namespace spec\OrientExpress\Suspect; use PhpSpec\ObjectBehavior; use Prophecy\Argument; class SuspectSpec

    extends ObjectBehavior { //... function it_should_answer_questions() { $this->answer('Are you the killer?') ->shouldReturn('Nope, not me'); } }
  4. THE SUSPECTS - REFACTORING MADE EASY "Oh, I just remembered!"

    - Ma'am namespace spec\OrientExpress\Suspect; use PhpSpec\ObjectBehavior; use Prophecy\Argument; class SuspectSpec extends ObjectBehavior { // ... function it_should_not_confess_to_wrong_questions_if_guilty() { $this->setGuilty(true); $this->answer('Are you the killer?') ->shouldReturn('Nope, not me'); } }
  5. THE SUSPECTS - REFACTORING MADE EASY "Oh, I just remembered!"

    - Ma'am namespace spec\OrientExpress\Suspect; use PhpSpec\ObjectBehavior; use Prophecy\Argument; class SuspectSpec extends ObjectBehavior { // ... function it_should_confess_to_key_question_if_guilty() { $this->setGuilty(true); $this->answer('It was you!') ->shouldReturn('Mmmkay I confess'); } }
  6. THE SUSPECTS namespace OrientExpress\Suspect; class Suspect { protected $keyQuestion =

    'It was you!'; protected $guilty = false; public function answer($question) { if ($this->guilty && $question == $this->keyQuestion) { return 'Mmmkay I confess'; } return 'Nope, not me'; } // ... }
  7. THE OLDSCHOOL DETECTIVE // Oppa PHPUnit style function testSolve() {

    // ... $crime = $this->getMock('OrientExpress\Crime\Crime', array('getSuspects')); $crime->expects($this->any()) ->method('getSuspects') ->will($this->returnValue(array($suspect1, $suspect2)); // NoOoOoooOoOoOoo!!! }
  8. THE DETECTIVE class DetectiveSpec extends ObjectBehavior { // ... /**

    * @param OrientExpress\Crime\Crime $crime * @param OrientExpress\Suspect\Suspect $suspect1 * @param OrientExpress\Suspect\Suspect $suspect2 */ function it_should_be_able_to_solve_crimes($crime, $suspect1, $suspect2) { $crime->getSuspects() ->willReturn(array($suspect1, $suspect2)); $suspect1->answer('It was you!') ->willReturn('Nope, not me'); $suspect2->answer('It was you!') ->willReturn('Mmmkay I confess'); $this->solve($crime)->shouldReturn($suspect2); } }
  9. THE DETECTIVE namespace OrientExpress\Investigators; use OrientExpress\Crime\Crime; class Detective { public

    function solve(Crime $crime) { foreach ($crime->getSuspects() as $suspect) { $answer = $suspect->answer('It was you!'); if (preg_match('/confess/', $answer)) { return $suspect; } } } }
  10. DOES THE POLICE FUNCTION PROPERLY? Feature: In order to know

    the crimes on orient express As a Scotland Yard API client I want to get access to the archives
  11. DOES THE POLICE FUNCTION PROPERLY? Background: Given the following crimes

    exist: | name | | "Murder on the Orient Express" | And the following detectives exist: | name | | "Herculse Poirot" | And the following suspects exist: | name | | "Princess Dragomiroff" | | "Count Adrenyi" |
  12. Scenario: Getting data from the Scotland Yard's archives Given crime

    "Murder on the Orient Express" was solved by "Hercules P oirot" And crime "Murder on the Orient Express" had suspects: | name | | "Princess Dragomiroff" | | "Count Adrenyi" | When I send GET request to "/api/crimes/ORIENT_EXPRESS_CRIME_ID" Then the response should contain json: """ { "crime": { "name": "Murder on the Orient Express", "detective": { "name": "Hercules Poirot" }, "suspects": [ { "name": "Princes Dragomiroff" }, { "name": "Count Adrenyi" } ] } } """
  13. ? PhpSpec: Behat: Specs: ABOUT ME Karol Sójko Lead Software

    Architect @ Twitter: Github: https://github.com/phpspec/phpspec https://github.com/Behat/Behat https://github.com/karolsojko/bdd-in-practice Comet Cult @karolsojko karolsojko