[Rails] Test di convenzioni interne


Una tipologia di test assai utile sono i test di integrità delle convenzioni, che eseguono un check di sanità su una certa convenzione interna che il team si è dato per lo sviluppo/ manutenzione di una funzionalità.

Faccio un esempio concreto.

Nell'applicazione RAILS ereditata su cui stiamo lavorando (io e Ivan Lombardi Borgia) abbiamo alcuni modelli sempre chiamati sub_form che l'utente ADMIN può osservare e scaricare in versione CSV, con tante colonne quante i campi del modello e i valori correnti.

L'implementazione concreta prevede il render di alcuni partial ( '_header.xls.builder' , '_row.xls.builder' e '_empty.xls.builder' ) riferiti al modello sotto esame. Tali file sono presenti all'interno di ogni directory del tipo sub_form_something e ogni view ha sempre un solo campo di riferimento @sub_form.

La regola è:
"Ricordati che se aggiungi o togli campi dal modello di riferimento devi aggiornare i partial dell'export"

Ovviamente nel tempo non ci siamo ricordati ;-) quindi abbiamo optato per automatizzare con un test di configurazione questa regola:


it "should export all model's field" do
assert_fields_in_export(Factory.create(:first_sub_form), "first_sub_form_dir", do_not_include = ["countries", "leader"])
assert_fields_in_export(Factory.create(:second_sub_form), "second_sub_form_dir")
end


e l'implementazione della assert custom:


def assert_fields_in_export(sub_form, sub_form_dir, do_not_include = [])
view = ActionView::Base.new(ActionController::Base.view_paths, {})

class << sub_form =" sub_form" row_output =" view.render(:file"> "#{RAILS_ROOT}/app/views/account/#{sub_form_dir}/#{file_name}")

assert_equal sub_form.class.columns.length - (["id", "created_at", "updated_at"] + do_not_include).length , row_output.scan(//).length
}

end




Se ad esempio alla first_sub_form aggiungiamo un campo il test fallisce indicando: mi aspetto 13 campi ma ne vedo solo 12. Quindi potremo o escludere il campo dall'elenco da controllare oppure aggiornare i file. Il test non è ricco di dettagli, serve solo come remainder di una convenzione che ci siamo dimenticati di rispettare.

2 commenti:

Antonio ha detto...

Che immagine orrenda :-).
A me spaventa un po' l'idea di Rails sulle convenzioni. Non ti senti di non aver il controllo del tuo codice?

Tommaso Torti ha detto...

Rails c'entra poco. in generale su qualsiasi progetto entrano in gioco delle convenzioni su 'come si fa qualcosa'. Convenzioni che si dà il team.
Mi pare naturale in un qualsiasi progetto di team.

Il problema nasce quando ci si scorda di queste convenzioni :)