Inspired by reading DRY your Scopes…
Sometimes I find that I can write a bunch of tedious specs in a simplified manner described below.
It started innocently enough. As a certain set of features were growing, I found that I was writing repetitive tests like this:
context 'specialty patient section' do it('has specialty patient') { @plain_html.should =~ /Specialty Patient/ } it('has specialty patient trauma criteria') { @plain_html.should =~ /Trauma Activation/ } it('has specialty patient airway') { @plain_html.should =~ /Advanced Airway/ } end
So I threw that aside and simplified:
# Test that certain sections only display when there are data to be shown. dynamic_sections = ['Vital Signs', 'ECG', 'Flow Chart', 'Initial Assessment', 'Narrative', 'Specialty Patient — ACS', 'Specialty Patient — Advanced Airway', 'Specialty Patient — Burns', 'Specialty Patient — Stroke', 'Specialty Patient — CPR', 'Specialty Patient — Motor Vehicle Collision', 'Specialty Patient — Trauma Criteria', 'Specialty Patient — Obstetrical', 'Specialty Patient — Spinal Immobilization', 'Influenza Screening', 'SAD (Psychiatric Ax)', 'Incident Details', 'Crew Members', 'Insurance Details', 'Mileage', 'Additional Agencies', 'Next of Kin', 'Personal Items', 'Transfer Details'] context 'dynamic sections' do let(:p) { xml_str = ...some XML... Parser.new(xml_str) } let(:r) { Renderer::Customer1::HTML.new(p) } let(:html) { r.render } context ', when there is no info, ' do dynamic_sections.each do |s| it("should not have: #{s}") { html.should_not =~ /#{s}/ } end end end
Simple stuff… nothing amazing. Simply using ruby’s language to simplify the maintenance of the specs. When a new section is added to the HTML template, it merely needs to be added to the array. And since it is generating actual specs, you preserve meaningful error messages:
Renderer dynamic sections , when there is no info, should not have: Specialty Patient — Trauma Criteria
The intent of the test is very clear, and 24 lines of “it” specs are avoided.
Nice Jon.
Thanks for the cite.