287
(287 páginas) S04-3227 A35-WP/20 AD/2 5/7/04 ASAMBLEA — 35° PERÍODO DE SESIONES COMISIÓN ADMINISTRATIVA Cuestión 39: Presupuestos 39.1: Presupuesto por programas para 2005, 2006 y 2007 39.2: Gastos de los servicios administrativos y operacionales de cooperación técnica (AOSC) PROYECTO DE PRESUPUESTO POR PROGRAMAS DE LA ORGANIZACIÓN PARA 2005, 2006 Y 2007 RESUMEN En esta nota se presenta el proyecto de documento del Presupuesto por programas de la Organización para 2005, 2006 y 2007. En las páginas 12 a 15 figura un proyecto de resolución relativo a los proyectos de presupuestos que se someterá a la aprobación de la Asamblea. 1. Se adjunta el proyecto de documento para el Presupuesto por programas de la Organización para 2005, 2006 y 2007. Tras su consideración y aprobación por la Asamblea, esta nota de estudio se publicará como documento. — — — — — — — —

Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Gregory Moeck

Extending Your TDD Cycle Into JavaScript

@gregmoeck

Wednesday, May 16, 12

Page 2: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Quick Poll

Wednesday, May 16, 12

Page 3: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Question1

Wednesday, May 16, 12

Page 4: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Practice TDD/BDD In Ruby/Rails

Wednesday, May 16, 12

Page 5: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Question2

Wednesday, May 16, 12

Page 6: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Practice TDD/BDD In JavaScript

Wednesday, May 16, 12

Page 7: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Why The Difference?

Wednesday, May 16, 12

Page 8: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Why Can’t I Test My JS?

Wednesday, May 16, 12

Page 9: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

“All Of The Pain That We Feel When Writing Unit Tests

Points At Underlying Design Problems.

Michael Feathers, The Deep Synergy Between Good

Design and TestabilityWednesday, May 16, 12

Page 10: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

“ In Test First Development, When We Feel Pain, We

Change Our Tests. In Test Driven Development When We Feel Pain, We Change

Our Architecture

Corey Haines, Fast Rails Tests

Wednesday, May 16, 12

Page 11: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Story Time

Wednesday, May 16, 12

Page 12: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Imagine A Newbie Has Heard About The

“Wonders” Of TDD, And Comes To You With A

Question:

Wednesday, May 16, 12

Page 13: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

How Would I Test This?

Wednesday, May 16, 12

Page 14: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

<?php...<div id= “vault_items”> ... $query1 = "SELECT * FROM storage_access_vault_items WHERE access_id = {$_GET[pid]}"; $result1 = mysql_query($query1); $inner_vault_items = array(); while($this_item = mysql_fetch_assoc($result1))   { ?> <div class= “vault_item”> <?= $this_item[‘description’] ?> ... </div><?php } ...</div>?>

Wednesday, May 16, 12

Page 15: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Summary

Wednesday, May 16, 12

Page 16: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Writing Code Is Easy

Wednesday, May 16, 12

Page 17: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Testing Well Architected

Code Is EasyWednesday, May 16, 12

Page 18: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Architecting Code Well Is

HARD!!!!Wednesday, May 16, 12

Page 19: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Architectural Patterns To Help Testing

Wednesday, May 16, 12

Page 20: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Ports &

AdaptersWednesday, May 16, 12

Page 21: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

ApplicationDomain

Adapter

Port

Adapter

Port

Adapter

Port

Adapter

Port

Wednesday, May 16, 12

Page 22: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Key Idea:Isolate

Application Domain

Wednesday, May 16, 12

Page 23: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

What Is A Port?

Wednesday, May 16, 12

Page 24: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

An Interface To Technical

InfrastructureWednesday, May 16, 12

Page 25: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Examples:

Wednesday, May 16, 12

Page 26: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Examples:DOM

Wednesday, May 16, 12

Page 27: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Examples:DOM

XMLHTTPRequest

Wednesday, May 16, 12

Page 28: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Examples:DOM

XMLHTTPRequest

WEBDB

Wednesday, May 16, 12

Page 29: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Examples:DOM

XMLHTTPRequest

WEBDB

Websockets

Wednesday, May 16, 12

Page 30: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Examples:DOM

XMLHTTPRequest

WEBDB

Websockets

IndexedDB

Wednesday, May 16, 12

Page 31: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Examples:DOM

XMLHTTPRequest

WEBDB

Websockets

IndexedDB

LocalStorage

Wednesday, May 16, 12

Page 32: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Examples:DOM

XMLHTTPRequest

WEBDB

Websockets

IndexedDB

LocalStorage

Etc...

Wednesday, May 16, 12

Page 33: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

What Is An Adapter?

Wednesday, May 16, 12

Page 34: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

An Interface To Translate Domain Into

TechnicalWednesday, May 16, 12

Page 35: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Example:

DOMBoard

Renderer

renderBoard(numberOfRows, numberOfColumns)

markCell(row, column, marker)

Wednesday, May 16, 12

Page 36: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Why Is This Useful?

Wednesday, May 16, 12

Page 37: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Isolates From

Technical Concerns

Wednesday, May 16, 12

Page 38: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

No Browser Dependency

Wednesday, May 16, 12

Page 39: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Side Note:

Wednesday, May 16, 12

Page 40: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Wednesday, May 16, 12

Page 41: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests

Wednesday, May 16, 12

Page 42: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests

Wednesday, May 16, 12

Page 43: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests Node

Wednesday, May 16, 12

Page 44: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests NodeIntegration

Tests

Wednesday, May 16, 12

Page 45: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests NodeIntegration

Tests

Wednesday, May 16, 12

Page 46: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests NodeIntegration

Tests Browser

Wednesday, May 16, 12

Page 47: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests NodeIntegration

Tests Browser

Acceptance Tests

Wednesday, May 16, 12

Page 48: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests NodeIntegration

Tests Browser

Acceptance Tests

Wednesday, May 16, 12

Page 49: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Unit Tests NodeIntegration

Tests Browser

Acceptance Tests Webdriver

Wednesday, May 16, 12

Page 50: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Manage Your

Objects Peers

Wednesday, May 16, 12

Page 51: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Three Types Of Peers

Wednesday, May 16, 12

Page 52: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Dependencies

Wednesday, May 16, 12

Page 53: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Service The Object

NEEDS To Do Its Job

Wednesday, May 16, 12

Page 54: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Example:

PlayerPieces

Tracker

markCell(row, column, marker)

BoardView

Wednesday, May 16, 12

Page 55: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Should Pass Dependency

Into The Constructor

Wednesday, May 16, 12

Page 56: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Notifications

Wednesday, May 16, 12

Page 57: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Peers That Need To Be Kept Up To

DateWednesday, May 16, 12

Page 58: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Example:

Turn Tracker

newPlayersTurn(player)

TurnTrackerListener

Wednesday, May 16, 12

Page 59: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Dynamically Add

Listeners At Run Time

Wednesday, May 16, 12

Page 60: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Adjustments / Strategies

Wednesday, May 16, 12

Page 61: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Example:

EventDispatcher

receiveCell(cell)

CurrentPlayer

Wednesday, May 16, 12

Page 62: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Behavior Needs To Be Changeable At Runtime

Wednesday, May 16, 12

Page 63: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Structural Example

Wednesday, May 16, 12

Page 64: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

XO

OO

XX X

Tic-Tac-Toe

Wednesday, May 16, 12

Page 65: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Emergent Design, So

Not Perfectly Architected

Wednesday, May 16, 12

Page 66: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Https://github.com/gmoeck/tic-tac-toe

Wednesday, May 16, 12

Page 67: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Basic Tooling

Wednesday, May 16, 12

Page 68: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

CONFIG = ENV['CONFIG'] || 'Debug'

require 'rack'

namespace :test do

desc "Run all acceptance tests"

task :acceptance do

system("rspec spec/acceptance/end_to_end.rb --color")

end

desc "Run all unit tests"

task :unit do

system("node node_modules/jasmine-node/lib/jasmine-node/cli.js spec/unit --color")

end

desc "Run all integration tests"

task :integration do

File.delete("spec/integration/runner/all_tests.js") if File.file?("spec/integration/runner/all_tests.js")

File.open("spec/integration/runner/all_tests.js", 'w') do |f|

Dir.glob("spec/integration/*_spec.js").each do |file_name|

file_name = file_name.slice(/[a-zA-z]*_spec/)

f.write("require('#{file_name}');\n")

end

end

system("./bin/build_integration_tests.js")

system("open spec/integration/runner/runner.html")

end

task :all => [:unit, :acceptance]

end

desc "Debug the application"

task :debug do

system("./bin/build_application.js")

sleep 1

system("open public/index.html")

end

desc "Run a server for prototyping"

task :server do

Rack::Handler::Thin.run Rack::Directory.new(File.expand_path('public')), :Port => 3000

end

Wednesday, May 16, 12

Page 69: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Summary:

Wednesday, May 16, 12

Page 70: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Summary:Uses Modulr For Package Dependencies

Wednesday, May 16, 12

Page 71: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Summary:Rake Test:[unit,integration,acceptance]

Uses Modulr For Package Dependencies

Wednesday, May 16, 12

Page 72: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Summary:Rake Test:[unit,integration,acceptance]

Rake Debug

Uses Modulr For Package Dependencies

Wednesday, May 16, 12

Page 73: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

First End-To-End

TestWednesday, May 16, 12

Page 74: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe "end to end acceptance test", :type => :request do  before(:each) do    @application = TicTacToeApplicationDriver.new    @application.start  end

  it "marks the board" do    @application.mark_board(1,1)    @application.shows_board(      [        [' ',' ',' '],        [' ','X',' '],        [' ',' ',' ']      ]    )  endend

Wednesday, May 16, 12

Page 75: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

class TicTacToeApplicationDriver  include Capybara::DSL  include Capybara::RSpecMatchers  APPLICATION_PORT = 1234  def initialize    @application_server = ApplicationServer.new  end  def start    @application_server.start    visit "http://localhost:#{APPLICATION_PORT}/index.html"  end  def mark_board(x,y)    cell_at(x,y).click  end  def shows_board(board)    board.each_index do |row|      board[row].each_index do |column|        if board[row][column] != ' '          cell_at(column, row).text.should == board[row][column]        end      end    end  end

private def cell_at(x,y)    find("[data-board-x='#{x}'][data-board-y='#{y}']")  endend

Wednesday, May 16, 12

Page 76: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure/Error: @application.mark_board(0,0)

Capybara::ElementNotFound:

Unable to find css "[data-board-x='0'][data-board-y='0']"

Wednesday, May 16, 12

Page 77: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:acceptanceFailure/Error: @application.mark_board(0,0)

Capybara::ElementNotFound:

Unable to find css "[data-board-x='0'][data-board-y='0']"

Wednesday, May 16, 12

Page 78: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('./ui/dom_board_view').DOMBoardView;

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView(); boardView.renderBoard(3,3);});

Wednesday, May 16, 12

Page 79: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('./ui/dom_board_view').DOMBoardView;

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView(); boardView.renderBoard(3,3);});

Wednesday, May 16, 12

Page 80: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('./ui/dom_board_view').DOMBoardView;

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView(); boardView.renderBoard(3,3);});

main.js

Wednesday, May 16, 12

Page 81: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('ui/dom_board_view').DOMBoardView;

describe('DOMBoardView', function() {  var view;  beforeEach(function() {    view = new BoardView(); view.renderBoard(3,3);  });

  afterEach(function() {    view.remove();  });

  it('renders the proper number of cells', function() {    expect(document.querySelectorAll('[data-board-x][data-board-y]').length).toBe(9);  }); });

Wednesday, May 16, 12

Page 82: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('ui/dom_board_view').DOMBoardView;

describe('DOMBoardView', function() {  var view;  beforeEach(function() {    view = new BoardView(); view.renderBoard(3,3);  });

  afterEach(function() {    view.remove();  });

  it('renders the proper number of cells', function() {    expect(document.querySelectorAll('[data-board-x][data-board-y]').length).toBe(9);  }); });

spec/integration/dom_board_view_spec.js

Wednesday, May 16, 12

Page 83: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 84: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:integration

Failure

Wednesday, May 16, 12

Page 85: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = function() {};

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); document.body.appendChild(cell); } } }};

Wednesday, May 16, 12

Page 86: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = function() {};

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); document.body.appendChild(cell); } } }};

src/ui/dom_board_view.js

Wednesday, May 16, 12

Page 87: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 88: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:integration

Passed

Wednesday, May 16, 12

Page 89: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure/Error: @application.shows_board(

expected: "X"

got: "" (using ==)

Wednesday, May 16, 12

Page 90: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:acceptance Failure/Error: @application.shows_board(

expected: "X"

got: "" (using ==)

Wednesday, May 16, 12

Page 91: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('ui/dom_board_view').DOMBoardView;var fireEvent = require('./test_helpers').fireEvent;

describe('DOMBoardView', function() { ... describe('when clicking on a cell', function() {    it('marks the cell with "X" when clicked', function() {      fireEvent(document.querySelector('[data-board-x="1"][data-board-y="1"]'), 'click');

      expect(document.querySelector('[data-board-x="1"][data-board-y="1"]').innerText).toEqual('X');    });  });});

Wednesday, May 16, 12

Page 92: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('ui/dom_board_view').DOMBoardView;var fireEvent = require('./test_helpers').fireEvent;

describe('DOMBoardView', function() { ... describe('when clicking on a cell', function() {    it('marks the cell with "X" when clicked', function() {      fireEvent(document.querySelector('[data-board-x="1"][data-board-y="1"]'), 'click');

      expect(document.querySelector('[data-board-x="1"][data-board-y="1"]').innerText).toEqual('X');    });  });});

spec/integration/dom_board_view_spec.js

Wednesday, May 16, 12

Page 93: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 94: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:integration

Failure

Wednesday, May 16, 12

Page 95: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = function() {};

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); document.body.appendChild(cell); } } }};

Wednesday, May 16, 12

Page 96: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = function() {};

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); document.body.appendChild(cell); } } }};

src/ui/dom_board_view.js

Wednesday, May 16, 12

Page 97: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); cell.addEventListener('click', this._cellClicked.bind(this, i, j)); document.body.appendChild(cell); } } }, _cellClicked: function(row, column) { var cell = document.querySelector( '[data-board-x="' + column + '"]' +                            '[data-board-y="' + row + '"]');    cell.innerText = 'X'; }};

Wednesday, May 16, 12

Page 98: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); cell.addEventListener('click', this._cellClicked.bind(this, i, j)); document.body.appendChild(cell); } } }, _cellClicked: function(row, column) { var cell = document.querySelector( '[data-board-x="' + column + '"]' +                            '[data-board-y="' + row + '"]');    cell.innerText = 'X'; }};

src/ui/dom_board_view.js

Wednesday, May 16, 12

Page 99: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); cell.addEventListener('click', this._cellClicked.bind(this, i, j)); document.body.appendChild(cell); } } }, _cellClicked: function(row, column) { var cell = document.querySelector( '[data-board-x="' + column + '"]' +                            '[data-board-y="' + row + '"]');    cell.innerText = 'X'; }};

Wednesday, May 16, 12

Page 100: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); cell.addEventListener('click', this._cellClicked.bind(this, i, j)); document.body.appendChild(cell); } } }, _cellClicked: function(row, column) { var cell = document.querySelector( '[data-board-x="' + column + '"]' +                            '[data-board-y="' + row + '"]');    cell.innerText = 'X'; }};

src/ui/dom_board_view.js

Wednesday, May 16, 12

Page 101: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 102: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:integration

Passed

Wednesday, May 16, 12

Page 103: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 104: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:acceptance

Passed

Wednesday, May 16, 12

Page 105: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Refactor To Add Style In Rendering

Wednesday, May 16, 12

Page 106: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

...

Wednesday, May 16, 12

Page 107: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Refactor To Be True Adapter

Wednesday, May 16, 12

Page 108: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); cell.addEventListener('click', this._cellClicked.bind(this, i, j)); document.body.appendChild(cell); } } }, _cellClicked: function(row, column) { var cell = document.querySelector( '[data-board-x="' + column + '"]' +                            '[data-board-y="' + row + '"]');    cell.innerText = 'X'; }};

Wednesday, May 16, 12

Page 109: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); cell.addEventListener('click', this._cellClicked.bind(this, i, j)); document.body.appendChild(cell); } } }, _cellClicked: function(row, column) { var cell = document.querySelector( '[data-board-x="' + column + '"]' +                            '[data-board-y="' + row + '"]');    cell.innerText = 'X'; }};

src/ui/dom_board_view.js

Wednesday, May 16, 12

Page 110: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); cell.addEventListener('click', this._cellClicked.bind(this, i, j)); document.body.appendChild(cell); } } }, _cellClicked: function(row, column) { var cell = document.querySelector( '[data-board-x="' + column + '"]' +                            '[data-board-y="' + row + '"]');    cell.innerText = 'X'; }};

Wednesday, May 16, 12

Page 111: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { renderBoard: function(rows, columns) { for(var i = 0; i < rows; i++) { for(var j = 0; j < columns; i++) { var cell = document.createElement('div'); cell.setAttribute('data-board-x', j); cell.setAttribute('data-board-y', i); cell.addEventListener('click', this._cellClicked.bind(this, i, j)); document.body.appendChild(cell); } } }, _cellClicked: function(row, column) { var cell = document.querySelector( '[data-board-x="' + column + '"]' +                            '[data-board-y="' + row + '"]');    cell.innerText = 'X'; }};

src/ui/dom_board_view.js

Wednesday, May 16, 12

Page 112: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe('DOMBoardView', function() { ... describe('when clicking on a cell', function() {    it('marks the cell with "X" when clicked', function() { var listener = {        cellSelected: jasmine.createSpy('listener#cellSelected')      };      view.addListener('cellSelected', listener);

      fireEvent(document.querySelector('[data-board-x="1"][data-board-y="1"]'), 'click');

      expect(listener.cellSelected).toHaveBeenCalledWith({ row: 1, column: 1 }); });  });});

Wednesday, May 16, 12

Page 113: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe('DOMBoardView', function() { ... describe('when clicking on a cell', function() {    it('marks the cell with "X" when clicked', function() { var listener = {        cellSelected: jasmine.createSpy('listener#cellSelected')      };      view.addListener('cellSelected', listener);

      fireEvent(document.querySelector('[data-board-x="1"][data-board-y="1"]'), 'click');

      expect(listener.cellSelected).toHaveBeenCalledWith({ row: 1, column: 1 }); });  });});

spec/integration/dom_board_view_spec.js

Wednesday, May 16, 12

Page 114: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 115: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:integration

Failure

Wednesday, May 16, 12

Page 116: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { ... addListener: function(event, listener) { this._listener = listener; },

_cellClicked: function(row, column) { this._listener.cellSelected(row, column); }};

Wednesday, May 16, 12

Page 117: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView.prototype = { ... addListener: function(event, listener) { this._listener = listener; },

_cellClicked: function(row, column) { this._listener.cellSelected(row, column); }};

src/ui/dom_board_view.js

Wednesday, May 16, 12

Page 118: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure/Error: @application.shows_board(

expected: "X"

got: "" (using ==)

Wednesday, May 16, 12

Page 119: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:acceptance Failure/Error: @application.shows_board(

expected: "X"

got: "" (using ==)

Wednesday, May 16, 12

Page 120: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('./ui/dom_board_view').DOMBoardView;

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView(); var eventHandler = { cellSelected: function(row, column) { boardView.markCell(row, column, ‘X’); } }; boardView.addListener(‘cellSelected’, eventHandler); boardView.renderBoard(3,3);});

Wednesday, May 16, 12

Page 121: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('./ui/dom_board_view').DOMBoardView;

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView(); var eventHandler = { cellSelected: function(row, column) { boardView.markCell(row, column, ‘X’); } }; boardView.addListener(‘cellSelected’, eventHandler); boardView.renderBoard(3,3);});

Wednesday, May 16, 12

Page 122: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('./ui/dom_board_view').DOMBoardView;

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView(); var eventHandler = { cellSelected: function(row, column) { boardView.markCell(row, column, ‘X’); } }; boardView.addListener(‘cellSelected’, eventHandler); boardView.renderBoard(3,3);});

main.js

Wednesday, May 16, 12

Page 123: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 124: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:acceptance

Passed

Wednesday, May 16, 12

Page 125: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView

Main

cellSelected

DO

MBo

ardV

iewLis

tene

r

markCell

Wednesday, May 16, 12

Page 126: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Mark Multiple

CellsWednesday, May 16, 12

Page 127: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView

Main

cellSelected

DO

MBo

ardV

iewLis

tene

r

markCell

TurnTracker

newPlayersTurn

TurnTrackerListener

Wednesday, May 16, 12

Page 128: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('./ui/dom_board_view').DOMBoardView;var TurnTracker = require('./turn_tracker').TurnTracker;

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView(); var turnTracker = new TurnTracker(‘X’, ‘O’); var eventHandler = { cellSelected: function(row, column) { boardView.markCell(row, column, ‘X’); turnTracker.playerOwnsNewCell({row: row, column: column}); } }; turnTracker.addListener(‘newPlayersTurn’, eventHandler); boardView.addListener(‘cellSelected’, eventHandler);

turnTracker.startNewGame(); boardView.renderBoard(3,3);});

Wednesday, May 16, 12

Page 129: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMBoardView = require('./ui/dom_board_view').DOMBoardView;var TurnTracker = require('./turn_tracker').TurnTracker;

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView(); var turnTracker = new TurnTracker(‘X’, ‘O’); var eventHandler = { cellSelected: function(row, column) { boardView.markCell(row, column, ‘X’); turnTracker.playerOwnsNewCell({row: row, column: column}); } }; turnTracker.addListener(‘newPlayersTurn’, eventHandler); boardView.addListener(‘cellSelected’, eventHandler);

turnTracker.startNewGame(); boardView.renderBoard(3,3);});

main.js

Wednesday, May 16, 12

Page 130: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var TurnTracker = require('../../src/turn_tracker').TurnTracker;

describe('TurnTracker', function() { it('notifies its listeners that it is the first players turn when told to start a new game', function() { var player1 = {player: 1}, player2 = {player:2};    var turnTracker = new TurnTracker(player1, player2); var listener = { newPlayersTurn: jasmine.createSpy(‘listener#newPlayersTurn’) }; turnTracker.addListener(‘newPlayersTurn’, listener); turnTracker.startNewGame();

    expect(listener.newPlayersTurn).toHaveBeenCalledWith( player1);

  });});

Wednesday, May 16, 12

Page 131: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var TurnTracker = require('../../src/turn_tracker').TurnTracker;

describe('TurnTracker', function() { it('notifies its listeners that it is the first players turn when told to start a new game', function() { var player1 = {player: 1}, player2 = {player:2};    var turnTracker = new TurnTracker(player1, player2); var listener = { newPlayersTurn: jasmine.createSpy(‘listener#newPlayersTurn’) }; turnTracker.addListener(‘newPlayersTurn’, listener); turnTracker.startNewGame();

    expect(listener.newPlayersTurn).toHaveBeenCalledWith( player1);

  });});

spec/unit/turn_tracker_spec.js

Wednesday, May 16, 12

Page 132: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 133: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 134: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var TurnTracker = function(player1, player2) { this._player1 = player1; this._player2 = player2;};

TurnTracker.prototype = { addListener: function(event, listener) { this._listener = listener; },

startNewGame: function() { this._listener.newPlayersTurn(player1); }};

Wednesday, May 16, 12

Page 135: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var TurnTracker = function(player1, player2) { this._player1 = player1; this._player2 = player2;};

TurnTracker.prototype = { addListener: function(event, listener) { this._listener = listener; },

startNewGame: function() { this._listener.newPlayersTurn(player1); }};

src/turn_tracker.js

Wednesday, May 16, 12

Page 136: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 137: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 138: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Duplicate Code For

EventsWednesday, May 16, 12

Page 139: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announce = require('../../src/util/announcer').Announcer;

describe('Announcer', function() { var announcer, listener;  beforeEach(function() {    announcer = new Announcer();    listener = {      someEvent: jasmine.createSpy('listener#someEvent')    };  });

it('notifies its listeners when an event they are registered for happens', function() {    announcer.addListener('someEvent', listener);

    announcer.announce('someEvent', 'abc');

    expect(listener.someEvent).toHaveBeenCalledWith('abc');  });});

Wednesday, May 16, 12

Page 140: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announce = require('../../src/util/announcer').Announcer;

describe('Announcer', function() { var announcer, listener;  beforeEach(function() {    announcer = new Announcer();    listener = {      someEvent: jasmine.createSpy('listener#someEvent')    };  });

it('notifies its listeners when an event they are registered for happens', function() {    announcer.addListener('someEvent', listener);

    announcer.announce('someEvent', 'abc');

    expect(listener.someEvent).toHaveBeenCalledWith('abc');  });});

spec/unit/announcer_spec.js

Wednesday, May 16, 12

Page 141: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 142: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 143: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announcer = function() {};

Announcer.prototype = { addListener: function(event, listener) { this._listener = listener; },

announce: function(event, data) { this._listener.someEvent(data); }};

Wednesday, May 16, 12

Page 144: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announcer = function() {};

Announcer.prototype = { addListener: function(event, listener) { this._listener = listener; },

announce: function(event, data) { this._listener.someEvent(data); }};

src/util/announcer.js

Wednesday, May 16, 12

Page 145: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 146: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 147: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announce = require('../../src/util/announcer').Announcer;

describe('Announcer', function() { ... it('does not notify its listeners when an event they are not registered for happens', function() {    announcer.addListener('anotherEvent', listener);

    announcer.announce('someEvent', 'abc');

    expect(listener.someEvent).not.toHaveBeenCalled();  });});

Wednesday, May 16, 12

Page 148: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announce = require('../../src/util/announcer').Announcer;

describe('Announcer', function() { ... it('does not notify its listeners when an event they are not registered for happens', function() {    announcer.addListener('anotherEvent', listener);

    announcer.announce('someEvent', 'abc');

    expect(listener.someEvent).not.toHaveBeenCalled();  });});

spec/unit/announcer_spec.js

Wednesday, May 16, 12

Page 149: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 150: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 151: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announcer = function() {};

Announcer.prototype = { addListener: function(event, listener) { this._listener = listener; this._event = event; },

announce: function(event, data) { if (this._event === event) { this._listener.someEvent(data); } }};

Wednesday, May 16, 12

Page 152: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announcer = function() {};

Announcer.prototype = { addListener: function(event, listener) { this._listener = listener; this._event = event; },

announce: function(event, data) { if (this._event === event) { this._listener.someEvent(data); } }};

src/util/announcer.js

Wednesday, May 16, 12

Page 153: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 154: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 155: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announce = require('../../src/util/announcer').Announcer;

describe('Announcer', function() { ... it('notifies multiple listeners when an event they are registered for happens', function() {    var listener2 = {      anotherEvent: jasmine.createSpy('listener2#anotherEvent')    };

    announcer.addListener('anotherEvent', listener);    announcer.addListener('anotherEvent', listener2);    announcer.announce('anotherEvent', 'abc');

    expect(listener.someEvent).toHaveBeenCalledWith('abc');    expect(listener2.someEvent).toHaveBeenCalledWith('abc');  });});

Wednesday, May 16, 12

Page 156: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announce = require('../../src/util/announcer').Announcer;

describe('Announcer', function() { ... it('notifies multiple listeners when an event they are registered for happens', function() {    var listener2 = {      anotherEvent: jasmine.createSpy('listener2#anotherEvent')    };

    announcer.addListener('anotherEvent', listener);    announcer.addListener('anotherEvent', listener2);    announcer.announce('anotherEvent', 'abc');

    expect(listener.someEvent).toHaveBeenCalledWith('abc');    expect(listener2.someEvent).toHaveBeenCalledWith('abc');  });});

spec/unit/announcer_spec.js

Wednesday, May 16, 12

Page 157: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 158: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 159: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announcer = function() {  this._events = {};};

Announcer.prototype = {  addListener: function(event, listener) {    this._events[event] = this._events[event] || [];    this._events[event].push(listener);  },

  announce: function(event, data) {    var registeredListeners = this._events[event] || [];    registeredListeners.forEach(function(listener) {      listener[event](data);    });  }};

Wednesday, May 16, 12

Page 160: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announcer = function() {  this._events = {};};

Announcer.prototype = {  addListener: function(event, listener) {    this._events[event] = this._events[event] || [];    this._events[event].push(listener);  },

  announce: function(event, data) {    var registeredListeners = this._events[event] || [];    registeredListeners.forEach(function(listener) {      listener[event](data);    });  }};

src/util/announcer.js

Wednesday, May 16, 12

Page 161: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 162: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 163: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announcer = require('./util/announcer').Announcer;var TurnTracker = function(player1, player2) { this._player1 = player1; this._player2 = player2; this._announcer = new Announcer();};

TurnTracker.prototype = { addListener: function(event, listener) { this._announcer.addListener(event, listener); },

startNewGame: function() { this._announcer.announce('newPlayersTurn', this._player1); }};

Wednesday, May 16, 12

Page 164: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Announcer = require('./util/announcer').Announcer;var TurnTracker = function(player1, player2) { this._player1 = player1; this._player2 = player2; this._announcer = new Announcer();};

TurnTracker.prototype = { addListener: function(event, listener) { this._announcer.addListener(event, listener); },

startNewGame: function() { this._announcer.announce('newPlayersTurn', this._player1); }};

src/turn_tracker.js

Wednesday, May 16, 12

Page 165: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 166: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 167: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Same With DOM Board

ViewWednesday, May 16, 12

Page 168: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var TurnTracker = require('../../src/turn_tracker').TurnTracker;

describe('TurnTracker', function() { ... it('notifies its listeners that it is the next players turn when told to that a player now owns a new cell', function() {    turnTracker.startNewGame();    listener.newPlayersTurn.reset();

    turnTracker.playerOwnsNewCell({row: 1, column: 1});

    expect(listener.newPlayersTurn).toHaveBeenCalledWith( player2);  });});

Wednesday, May 16, 12

Page 169: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var TurnTracker = require('../../src/turn_tracker').TurnTracker;

describe('TurnTracker', function() { ... it('notifies its listeners that it is the next players turn when told to that a player now owns a new cell', function() {    turnTracker.startNewGame();    listener.newPlayersTurn.reset();

    turnTracker.playerOwnsNewCell({row: 1, column: 1});

    expect(listener.newPlayersTurn).toHaveBeenCalledWith( player2);  });});

spec/unit/turn_tracker_spec.js

Wednesday, May 16, 12

Page 170: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 171: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 172: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

With Some Refactoring

Wednesday, May 16, 12

Page 173: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var STATES = {  PLAYER1_TURN: {    playerOwnsNewCell: function(newCellInformation) {      this._announcer.announce('newPlayersTurn', this._player2);      this._currentState = STATES.PLAYER2_TURN;    }  },

  PLAYER2_TURN: {    playerOwnsNewCell: function(newCellInformation) {      this._announcer.announce('newPlayersTurn', this._player1);      this._currentState = STATES.PLAYER1_TURN;    }  }};

var TurnTracker = function(player1, player2) {  this._announcer = new Announcer();  this._player1 = player1;  this._player2 = player2;  this._currentState = STATES.PLAYER1_TURN;};

TurnTracker.prototype = {  addListener: function(event, listener) {    this._announcer.addListener(event, listener);  },

  playerOwnsNewCell: function(newCellInformation) {    this._currentState.playerOwnsNewCell.call(this, newCellInformation);  },

  startNewGame: function() {    this._announcer.announce('newPlayersTurn', this._player1);    this._currentState = STATES.PLAYER1_TURN;  }};

Wednesday, May 16, 12

Page 174: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var STATES = {  PLAYER1_TURN: {    playerOwnsNewCell: function(newCellInformation) {      this._announcer.announce('newPlayersTurn', this._player2);      this._currentState = STATES.PLAYER2_TURN;    }  },

  PLAYER2_TURN: {    playerOwnsNewCell: function(newCellInformation) {      this._announcer.announce('newPlayersTurn', this._player1);      this._currentState = STATES.PLAYER1_TURN;    }  }};

var TurnTracker = function(player1, player2) {  this._announcer = new Announcer();  this._player1 = player1;  this._player2 = player2;  this._currentState = STATES.PLAYER1_TURN;};

TurnTracker.prototype = {  addListener: function(event, listener) {    this._announcer.addListener(event, listener);  },

  playerOwnsNewCell: function(newCellInformation) {    this._currentState.playerOwnsNewCell.call(this, newCellInformation);  },

  startNewGame: function() {    this._announcer.announce('newPlayersTurn', this._player1);    this._currentState = STATES.PLAYER1_TURN;  }};

src/turn_tracker.js

Wednesday, May 16, 12

Page 175: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 176: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 177: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 178: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:acceptance

Passed

Wednesday, May 16, 12

Page 179: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Show And Track Victory

Wednesday, May 16, 12

Page 180: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe "end to end acceptance test", :type => :request do ...  it "marks the board" do ...    @application.mark_board(1,0)    @application.shows_board(      [        ['X','X',' '],        ['O','O',' '],        [' ',' ',' ']      ]    ) @application.mark_board(0,2)    @application.shows_board(      [        ['X','X','X'],        ['O','O',' '],        [' ',' ',' ']      ]    ) @application.shows_player1_won  endend

Wednesday, May 16, 12

Page 181: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure/Error: @application.shows_player1_won

Wednesday, May 16, 12

Page 182: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:acceptance

Failure/Error: @application.shows_player1_won

Wednesday, May 16, 12

Page 183: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView

Main

cellSelected

DO

MBo

ardV

iewLis

tene

r

markCell

TurnTracker

newPlayersTurn

TurnTrackerListener

playerOwnsNewCell

Wednesday, May 16, 12

Page 184: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView

Main

TurnTracker

PlayerplayerOwnsNewCell

markCell

DOMAlert

RenderershowPlayerWonGame

receiveCell

Wednesday, May 16, 12

Page 185: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView();  var player1 = new Player('X', boardView, alertRenderer);  var player2 = new Player('O', boardView, alertRenderer);  var turnTracker = new TurnTracker(player1, player2);  var eventHandler = { cellSelected: function(cellInformation) { this._currentPlayer.receiveCell(cellInformation); }, newPlayersTurn: function(player) { this._currentPlayer = player; } }  var alertRenderer = new DOMAlertRenderer();

  turnTracker.addListener('newPlayersTurn', eventHandler);  boardView.addListener('cellSelected', eventHandler);  player1.addListener('playerOwnsNewCell', turnTracker);  player2.addListener('playerOwnsNewCell', turnTracker);

  turnTracker.startNewGame();  boardView.renderBoard(3, 3);});

Wednesday, May 16, 12

Page 186: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

document.addEventListener("DOMContentLoaded", function() {  var boardView = new DOMBoardView();  var player1 = new Player('X', boardView, alertRenderer);  var player2 = new Player('O', boardView, alertRenderer);  var turnTracker = new TurnTracker(player1, player2);  var eventHandler = { cellSelected: function(cellInformation) { this._currentPlayer.receiveCell(cellInformation); }, newPlayersTurn: function(player) { this._currentPlayer = player; } }  var alertRenderer = new DOMAlertRenderer();

  turnTracker.addListener('newPlayersTurn', eventHandler);  boardView.addListener('cellSelected', eventHandler);  player1.addListener('playerOwnsNewCell', turnTracker);  player2.addListener('playerOwnsNewCell', turnTracker);

  turnTracker.startNewGame();  boardView.renderBoard(3, 3);});

main.js

Wednesday, May 16, 12

Page 187: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe('Player', function() {  var player, board, listener;  beforeEach(function() {    board = new BoardRole();    player = new Player('X', board);    listener = new PlayerListenerRole();    player.addListener('playerOwnsNewCell', listener);  });

  describe('when it is told that to receive a cell', function() {    beforeEach(function() {      player.receiveCell({row: 2, column: 2});    });

    it('tells its board to mark that square with its marker', function() {      expect(board.markCell).toHaveBeenCalledWith(2,2,'X');    });  });

Wednesday, May 16, 12

Page 188: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe('Player', function() {  var player, board, listener;  beforeEach(function() {    board = new BoardRole();    player = new Player('X', board);    listener = new PlayerListenerRole();    player.addListener('playerOwnsNewCell', listener);  });

  describe('when it is told that to receive a cell', function() {    beforeEach(function() {      player.receiveCell({row: 2, column: 2});    });

    it('tells its board to mark that square with its marker', function() {      expect(board.markCell).toHaveBeenCalledWith(2,2,'X');    });  });

spec/unit/player_spec.js

Wednesday, May 16, 12

Page 189: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 190: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 191: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Player = function(marker, board, alertRenderer) { this._marker = marker; this._board = board;};

Player.prototype = { receiveCell: function(cellInformation) { this._board.markCell(cellInformation.row, cellInformation.column, this._marker); }};

Wednesday, May 16, 12

Page 192: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Player = function(marker, board, alertRenderer) { this._marker = marker; this._board = board;};

Player.prototype = { receiveCell: function(cellInformation) { this._board.markCell(cellInformation.row, cellInformation.column, this._marker); }};

src/player.js

Wednesday, May 16, 12

Page 193: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 194: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 195: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe('Player', function() {  var player, board, listener;  beforeEach(function() {    board = new BoardRole();    player = new Player('X', board);    listener = new PlayerListenerRole();    player.addListener('playerOwnsNewCell', listener);  });

  describe('when it is told that to receive a cell', function() {    beforeEach(function() {      player.receiveCell({row: 2, column: 2});    });

    it('tells its board to mark that square with its marker', function() {      expect(board.markCell).toHaveBeenCalledWith(2,2,'X');    });

    it('notifies its listeners that it owns the cell that was selected', function() {      expect(listener.playerOwnsNewCell).toHaveBeenCalledWith( {row: 2, column: 2});    }); ...  });

Wednesday, May 16, 12

Page 196: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe('Player', function() {  var player, board, listener;  beforeEach(function() {    board = new BoardRole();    player = new Player('X', board);    listener = new PlayerListenerRole();    player.addListener('playerOwnsNewCell', listener);  });

  describe('when it is told that to receive a cell', function() {    beforeEach(function() {      player.receiveCell({row: 2, column: 2});    });

    it('tells its board to mark that square with its marker', function() {      expect(board.markCell).toHaveBeenCalledWith(2,2,'X');    });

    it('notifies its listeners that it owns the cell that was selected', function() {      expect(listener.playerOwnsNewCell).toHaveBeenCalledWith( {row: 2, column: 2});    }); ...  });

spec/unit/player_spec.js

Wednesday, May 16, 12

Page 197: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 198: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 199: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Player = function(marker, board, alertRenderer) { this._marker = marker; this._board = board; this._announcer = new Announcer();};

Player.prototype = { receiveCell: function(cellInformation) { this._board.markCell(cellInformation.row, cellInformation.column, this._marker); this._announcer.announce('playerOwnsNewCell’, cellInformation); }};

Wednesday, May 16, 12

Page 200: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Player = function(marker, board, alertRenderer) { this._marker = marker; this._board = board; this._announcer = new Announcer();};

Player.prototype = { receiveCell: function(cellInformation) { this._board.markCell(cellInformation.row, cellInformation.column, this._marker); this._announcer.announce('playerOwnsNewCell’, cellInformation); }};

src/player.js

Wednesday, May 16, 12

Page 201: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 202: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 203: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe('Player', function() { ...  it('notifies tells its alerter that it has one the game when it receives all the cells in a row', function() { player.receiveCell({row: 0, column: 0}); player.receiveCell({row: 0, column: 1}); player.receiveCell({row: 0, column: 2}); expect(alerter.playerWonGame).toHaveBeenCalledWith({player: 'X'});  });});

Wednesday, May 16, 12

Page 204: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

describe('Player', function() { ...  it('notifies tells its alerter that it has one the game when it receives all the cells in a row', function() { player.receiveCell({row: 0, column: 0}); player.receiveCell({row: 0, column: 1}); player.receiveCell({row: 0, column: 2}); expect(alerter.playerWonGame).toHaveBeenCalledWith({player: 'X'});  });});

spec/unit/player_spec.js

Wednesday, May 16, 12

Page 205: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 206: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 207: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

With Some Refactoring

Wednesday, May 16, 12

Page 208: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Player = function(marker, board, alertRenderer) { this._marker = marker; this._board = board; this._alerter = alertRenderer; this._announcer = new Announcer(); this._rows = []; for(var i = 0; i < 3; i++) { this._rows[i] = new CellTracker(3); }};

Player.prototype = { receiveCell: function(cellInformation) { this._board.markCell(cellInformation.row, cellInformation.column, this._marker); this._announcer.announce('playerOwnsNewCell’, cellInformation); this._rows[cellInformation.row].takeCell(); if (this._hasWonGame(cellInformation)) { this._alerter.playerWonGame({player: this._marker}); } }};...

Wednesday, May 16, 12

Page 209: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var Player = function(marker, board, alertRenderer) { this._marker = marker; this._board = board; this._alerter = alertRenderer; this._announcer = new Announcer(); this._rows = []; for(var i = 0; i < 3; i++) { this._rows[i] = new CellTracker(3); }};

Player.prototype = { receiveCell: function(cellInformation) { this._board.markCell(cellInformation.row, cellInformation.column, this._marker); this._announcer.announce('playerOwnsNewCell’, cellInformation); this._rows[cellInformation.row].takeCell(); if (this._hasWonGame(cellInformation)) { this._alerter.playerWonGame({player: this._marker}); } }};...

src/player.js

Wednesday, May 16, 12

Page 210: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var CellTracker = function(totalCells) { this._remainingCells = totalCells;};

CellTracker.prototype = { takeCell: function() { this._remainingCells -= 1; },

hasAllCells: function() { return this._remainingCells === 0; }};

Wednesday, May 16, 12

Page 211: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var CellTracker = function(totalCells) { this._remainingCells = totalCells;};

CellTracker.prototype = { takeCell: function() { this._remainingCells -= 1; },

hasAllCells: function() { return this._remainingCells === 0; }};

src/player.js

Wednesday, May 16, 12

Page 212: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 213: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 214: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMAlertRenderer = require('ui/dom_alert_renderer').DOMAlertRenderer;

describe('DOMAlertRenderer', function() { it('renders an alert when a player wins the game', function() { var renderer = new DOMAlertRenderer(); renderer.playerWonGame({player: 'X'});

expect(document.body.querySelector('.alert').innerText).toEqual("'X' Wins"); });});

Wednesday, May 16, 12

Page 215: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMAlertRenderer = require('ui/dom_alert_renderer').DOMAlertRenderer;

describe('DOMAlertRenderer', function() { it('renders an alert when a player wins the game', function() { var renderer = new DOMAlertRenderer(); renderer.playerWonGame({player: 'X'});

expect(document.body.querySelector('.alert').innerText).toEqual("'X' Wins"); });});

spec/integration/dom_alert_renderer_spec.js

Wednesday, May 16, 12

Page 216: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Failure

Wednesday, May 16, 12

Page 217: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Failure

Wednesday, May 16, 12

Page 218: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMAlertRenderer = function() {};

DOMAlertRenderer.prototype = { playerWonGame: function(playerInformation) { var element = document.createElement('div'); element.className = 'alert'; element.innerText = ”’” + playerInformation.player + “‘ Wins”; document.body.appendChild(element); }};

Wednesday, May 16, 12

Page 219: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

var DOMAlertRenderer = function() {};

DOMAlertRenderer.prototype = { playerWonGame: function(playerInformation) { var element = document.createElement('div'); element.className = 'alert'; element.innerText = ”’” + playerInformation.player + “‘ Wins”; document.body.appendChild(element); }};

ui/dom_alert_renderer.js

Wednesday, May 16, 12

Page 220: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 221: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:unit

Passed

Wednesday, May 16, 12

Page 222: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Passed

Wednesday, May 16, 12

Page 223: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

rake test:acceptance

Passed

Wednesday, May 16, 12

Page 224: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Other Features

Wednesday, May 16, 12

Page 225: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

AI Player?

Wednesday, May 16, 12

Page 226: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView

Main

TurnTracker

PlayerplayerOwnsNewCell

markCell

DOMAlert

RenderershowPlayerWonGame

receiveCell

Wednesday, May 16, 12

Page 227: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Remote Player?

Wednesday, May 16, 12

Page 228: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

DOMBoardView

Main

TurnTracker

PlayerplayerOwnsNewCell

markCell

DOMAlert

RenderershowPlayerWonGame

receiveCell

Wednesday, May 16, 12

Page 229: Extending Your TDD Cycle Into JavaScriptfiles.meetup.com/310796/tdd_javascript.pdf · 1 Wednesday, May 16, 12. Practice TDD/BDD In Ruby/Rails Wednesday, May 16, 12. Question 2 Wednesday,

Questions?

Gregory Moeck@gregmoeck

Wednesday, May 16, 12