Prima l’esempio dummy:
class Product < ActiveRecord::Base
validates :code, uniqueness: true
…
def clone
Product.create(code: “New #{code}”, description: description)
end
end
describe Product, type: :model do
it “is valid” do
expect(build(:product)).to be_valid
end
describe “cloned object” do
before :context do
@pr = create(:product)
@cl = @pr.clone
end
it "has different code" do
expect(@cl.code).not_to eq(@pr.code)
end
it "has same description" do
expect(@cl.description).to eq(@pr.description)
end
it ...
end
end
La descrizione del mio problema:
Vorrei testare il corretto comportamento del metodo ‘clone’ di Product
verificando che la copia abbia tutti gli attributi uguali (tranne
l’attributo code).
Per fare ciò ho inserito un blocco ‘before :context’ che mi crea
l’originale e il suo clone e poi vado a testare ogni attributo.
Inserisco il tutto in un blocco ‘describe’ (o ‘context’) con la
convinzione che il before venga eseguito solo per gli esempi all’interno
di esso.
E invece no: il blocco ‘before :context’ viene eseguito anche fuori dal
blocco, nell’esempio mostrato viene eseguito anche prima dell’esempio
‘is valid’, e la validazione non passa in quanto il build prepara un
record con un code già esistente.
Infine le domande:
- è possibile separare il metodo ‘before’ per applicarlo solo ad un
sottoinsieme di esempi? - quale è la best practice in una situazione del genere?
Grazie mille per tutti i contributi e le risposte.
Ciao
i.