testing merb

46
Testing Merb The Right Way

Upload: yehuda-katz

Post on 18-May-2015

2.972 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Testing Merb

Testing Merb

The Right Way

Page 2: Testing Merb

Why Test?

Page 3: Testing Merb

TDD

Page 4: Testing Merb

TDD and Regressions

Page 5: Testing Merb

TDD and Regressions

I am not saying TDD is bad, but this talk doesn’t focus on mock-driven TDD.

Page 6: Testing Merb

Resiliant Against Refactoring

Page 7: Testing Merb

class Awesome def hello puts "~ Hello ~" endend

describe Awesome do it "prints hello" do awesome = Awesome.new awesome.should_receive(:puts) awesome.hello endend

Page 8: Testing Merb

class Awesome def hello awesome_print "~ Hello ~" end def awesome_print(str) print "#{str}\n" endend

describe Awesome do it "prints hello" do awesome = Awesome.new awesome.should_receive(:puts) awesome.hello endend

Page 9: Testing Merb

class Awesome def hello awesome_print "~ Hello ~" end def awesome_print(str) print "#{str}\n" endend

describe Awesome do it "prints hello" do awesome = Awesome.new awesome.should_receive(:puts) awesome.hello endend

FAIL

Page 10: Testing Merb

class Awesome def hello awesome_print "~ Hello ~" end def awesome_print(str) print "#{str}\n" endend

describe Awesome do it "prints hello" do capture { Awesome.new.hello }. should =~ /Hello/ endend

Page 11: Testing Merb

How to Test Three Rules

Page 12: Testing Merb

Broken Interface means failing tests

Page 13: Testing Merb

Working Interface means passing tests

Page 14: Testing Merb

Write tests about what you care about

Page 15: Testing Merb

http://example.com/foo

Controller

Filters

Views

Helpers

What Happens in Your App

Page 16: Testing Merb

Your App

http://example.com/foo

What You Care About

Page 17: Testing Merb

http://example.com/foo

Controller

4 Filters

Views

Helpers

H Partials

Refactoring

Page 18: Testing Merb

Iteration 1

Page 19: Testing Merb

class Foo < Application def awesome awesome_string end def awesome_string "Awesome" endend

Merb::Router.prepare do match("/foo/awesome"). to(:controller => Foo, :action => :awesome). name(:awesome)end

Page 20: Testing Merb

dispatch_to(Foo, :awesome) do |cont| cont.should_receive(:awesome_string)end

Page 21: Testing Merb

dispatch_to(Foo, :awesome) do |cont| cont.should_receive(:awesome_string)end

Page 22: Testing Merb

Iteration 2

Page 23: Testing Merb

class Bar < Application def coolness render end end

Merb::Router.prepare do match("/foo/awesome"). to(:controller => Bar, :action => :coolness). name(:awesome)end

Page 24: Testing Merb

dispatch_to(Foo, :awesome) do |cont| cont.should_receive(:awesome_string)end

Page 25: Testing Merb

dispatch_to(Foo, :awesome) do |cont| cont.should_receive(:awesome_string)end FAIL

Page 26: Testing Merb

request("/foo/awesome").body. should =~ /Awesome/

Page 27: Testing Merb

request(url(:awesome)).body. should =~ /Awesome/

Page 28: Testing Merb

Broken Interface means failing tests

Page 29: Testing Merb

Working Interface means passing tests

Page 30: Testing Merb

Write tests about what you care about

Page 31: Testing Merb

“It’s Too Hard”

Page 32: Testing Merb

Let’s Make it Easy

Page 33: Testing Merb

request(url(:speakers))

request(resource(@speaker))

request("/foo/speakers")

Page 34: Testing Merb

request(url(:speakers))

request(resource(@speaker))

request("/foo/speakers")

one method

Page 35: Testing Merb

Sessions are automatically sticky in a spec

Page 36: Testing Merb

it "should let you in" do request("/login", :method => :post, :params => {:username => "user", :password => "pass"}) request("/home").should be_successfulend

Page 37: Testing Merb

it "should let you in" do request("/login", :method => :post, :params => {:username => "user", :password => "pass"}) request("/home").should be_successfulend

login

Page 38: Testing Merb

it "should let you in" do request("/login", :method => :post, :params => {:username => "user", :password => "pass"}) request("/home").should be_successfulend

you’re logged in

Page 39: Testing Merb

describe "/login", :given => "successful login" do it "should let you in" do request("/home").should be_successful endend

simpler

Page 40: Testing Merb

describe "/login", :given => "successful login" do it "should let you in" do request("/home").should be_successful endend

simpler

Page 41: Testing Merb

Request

Rack

body headersstatus

Page 42: Testing Merb

request() helper

Rack

body headersstatus

Page 43: Testing Merb

request("/foo").body.should == "hello"

request("/foo").should have_xpath("//h1")

request("/foo").should( have_selector("h1:contains(text)"))

Page 44: Testing Merb

request("/foo").body.should == "hello"

request("/foo").should have_xpath("//h1")

request("/foo").should( have_selector("h1:contains(text)"))

1.0 final

Page 45: Testing Merb

request("/foo").should be_client_error

request("/foo").should( have_content_type(:json))

Page 46: Testing Merb

Thank you.