TDD often is well understood, but seldom put to good use. Spikes grow larger, hard to test aspects are skipped and sooner or later your test coverage looks like this.
Therefore i want to show you the Black-White-Tree testing method, which is easy to adopt and results in full C1(path) coverage with easy to maintain, independent tests.
The principle is simple:
When designing a new method build Black-Box tests for it, often 2-3 are sufficient if they exersice all paths within this method(not necessarily its sub-methods), represented by the trunk and the black branches.
describe :price do it "sums prices and applies discounts" do Order.new(:items=>items,:discount=>20).price.should == 22.5 end it "costs nothing if it is free" do Order.new(:items=>items,:free=>true,:discount=>10).price.should == 0 end end
Then write White Box tests, for the public method, mocking everything out with forged return values to verify that every method is called and the call-results are used logically.
describe :price do ... it "uses sum_price and apply_discount" do order = Order.new(:items=>items,:discount=>10) order.expects(:sum_prices).returns 100 order.expects(:apply_discount).with(10,100).returns 20 order.price.should == 20 end end
Then build the method, making all White Box and some of the Black Box tests pass.
Repeat for every sub-method.