Top Banner
Disconnecting the Database with ActiveRecord URUG 1-27-09 Saturday, February 21, 2009
9

Disconnecting the Database with ActiveRecord

Jan 21, 2018

Download

Technology

Ben Mabey
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Disconnecting the Database with ActiveRecord

Disconnecting the Database with ActiveRecord

URUG 1-27-09

Saturday, February 21, 2009

Page 2: Disconnecting the Database with ActiveRecord

Disconnecting the DB Comes with trade-offs and risks.

How big is your suite or how big do you expect it to be?

Do you have acceptance or functional tests that test the whole stack?

What is the skill level of your team and experience with AR and testing?

How comfortable is your team with stubbing?

Saturday, February 21, 2009

Page 3: Disconnecting the Database with ActiveRecord

The Benefits

Project A

2530 examples. Runs in 5:14 minutes.

Average example time: 0.1241s

Project B (in development) with NullDB

692 examples. Runs in 23.38 seconds.

Average example time: 0.0338s

“A unit test that takes longer than 0.10s is a slow unit test.” - Michael Feathers in Working Effectively with Legacy Code

Saturday, February 21, 2009

Page 4: Disconnecting the Database with ActiveRecord

File OrganizationGenerally run suites separate.

Additional conceptual overhead of different test files for the same object.

Get the option to delay running slower (functional) tests until CI.

Thats just one way... not the way I do it...

Saturday, February 21, 2009

Page 5: Disconnecting the Database with ActiveRecord

NullDBThe way I use it... I mix both types of tests in

one file. NullDB is On by default:require 'nulldb_rspec'ActiveRecord::Base.establish_connection(:adapter => :nulldb)

unless Object.const_defined?(:Functional) share_as :Functional do

before :all do ActiveRecord::Base.establish_connection(:test) end after :all do ActiveRecord::Base.establish_connection(:adapter => :nulldb) end endend

Saturday, February 21, 2009

Page 6: Disconnecting the Database with ActiveRecord

NullDBdescribe PetStore, "#special_dogs" do it "should return a list of all the special dogs" do # given dogs = [Dog.create!(:name => 'Fido'), Dog.create!(:name => 'Spot'), Dog.create!(:name => 'Cliford')] # nulldb will populate ids #Since Dog.find_by_complex_sql is tested we can stub with comfort Dog.stub!(:find_by_complex_sql).and_return(dogs) # when & then @pet_store.special_dogs.should == "Fido, Spot, and Clifford" endend

I work outside-in stubbing any methods with SELECTs first, and then test/implement those

methods against the database.Saturday, February 21, 2009

Page 7: Disconnecting the Database with ActiveRecord

NullDBTurn actual database on in example

groups that need a real DB:describe Dog, ".find_by_complex_sql" do include Functional it "should return ...." do ... end

it "should ..." do ... end

end

Saturday, February 21, 2009

Page 8: Disconnecting the Database with ActiveRecord

NullDBGotchas and associations caveats...

class Dog < AR::Base belongs_to :personend

class Person < AR::Base has_many :dogsend

describe Person, "#some_method_that_uses_dogs" do it "should ..." do person = create_person dog = create_dog(:person => person) # notice how we associate the person person.dogs.inpsect # odd nulldb bug... need to do a patch.. person.dogs << dog # now we associate the other way person.some_method_that_uses_dogs.should ... endend

Saturday, February 21, 2009

Page 9: Disconnecting the Database with ActiveRecord

New version of RSpec will having tagging...

describe Dog, ".find_by_complex_sql", :functional => true do it "should return ...." do ... end

it "should ..." do ... end

endYou’ll be able to run just the examples you want to!

http://rspec.lighthouseapp.com/projects/5645/tickets/682-conditional-exclusion-of-example-groups

Saturday, February 21, 2009