Synthesis visualizations
Synthesized testing is about accurately simulating object interactions and verifying that each end point of every interaction has been tested to work. The end result of a code base tested employing this strategy forms a specification of the application's ecosystem in terms of object communication.
Danilo has been recently contributing some excellent work around visual representations of the above. The code is being developed on the Synthesis experimental branch on github.
Consider the Synthesis
test_project
example.
class DataBrander BRAND = "METAL" def initialize(storage) @storage = storage end def save_branded(data) @storage.save "#{BRAND} - #{data}" end def dont_do_this @storage.ouch! end end class Storage def initialize(filename) @filename = filename end def save(val) File.open(@filename, 'w') {|f| f < val} end def ouch! raise Problem end end class Problem < Exception;end
Below are the complete specs for the above implementation.
describe DataBrander do it "should save branded to storage" do storage = Storage.new("") storage.should_receive(:save).with("METAL - rock") DataBrander.new(storage).save_branded("rock") end it "should delegate problem" do storage = Storage.new("") storage.should_receive(:ouch!).and_raise(Problem.new) proc {DataBrander.new(storage).dont_do_this}.should raise_error(Problem) end end describe Storage do it "should save to file" do begin Storage.new("test.txt").save("rock") File.read("test.txt").should == "rock" ensure FileUtils.rm_f("test.txt") end end it "should raise problem on ouch!" do proc { Storage.new("").ouch! }.should raise_error(Problem) end end
A Synthesis run using the DOT formatter produces:
Removing the
"should save to file"
spec will cause the Synthesis task to fail.
Below is how a real (relatively small) project looks like.
I find the ability to inspect our application modeling through such a representation a very appealing added benefit to the confidence in our system Synthesis provides us with. The DOT formatter will become part of the Synthesis gem as soon as we iron out the few remaining glitches.