Disconnecting the Database with ActiveRecord
-
Upload
ben-mabey -
Category
Technology
-
view
2.997 -
download
0
Transcript of 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
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
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
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
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
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
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
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