2015-02-09 12 views
19

mi piacerebbe mettere alla prova la mia associazione User modelli has_many :projects, dependent: :destroy e sono andato fino a questo punto, per ora:Come testare dipendente:: destroy con RSpec?

it "destroys dependent projects" do 
    user = FactoryGirl.build(:user) 
    project = FactoryGirl.build(:project) 

    user.projects << project 
    user.destroy 

    expect(Project.count).to change(-1) 
end 

ma questo emette un errore:

Failure/Error: expect(Project.count).to change(-1) 
    ArgumentError: 
     `change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message. 

quindi presumo che non è change l'abbinabile giusto, vero? Puoi dirmi come potrei scrivere questo test senza ottenere quell'errore?

risposta

24

E 'il matcher giusto, ma non lo si utilizza nel modo corretto:

  • aspettano ha bisogno di ricevere un blocco contenente l'azione da eseguire (nel tuo caso cancellando l'utente)
  • la modifica deve ricevere un blocco che produce il valore numerico che si prevede cambierà (può anche ricevere un oggetto e un simbolo che indica che rspec dovrebbe chiamare il metodo denominato)

Il modo corretto è

expect { user.destroy }.to change { Project.count } 

Questo afferma solo che i cambiamenti di valore numerico, ma non specifica di quanto. Per fare questo, la catena di una chiamata a by:

expect { user.destroy }.to change { Project.count }.by(-1) 
2

questo dovrebbe funzionare:

expect { user.destroy }.to change { Project.count }.by(-1) 
3

è opportuno verificare per la rimozione del progetto vero e proprio.

expect(Project.all).not_to include project 
23

È inoltre possibile utilizzare matchers shoulda:

it { expect(user).to have_many(:projects).dependent(:destroy) } 

https://github.com/thoughtbot/shoulda-matchers

+1

sta mostrando errore come metodo non definito dipendente .. – indb

+0

È necessario includere matchers Shoulda in spec_helper: 'richiedere 'Shoulda/matchers ', maggiori informazioni su dipendente: https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_record/association_matcher.rb#L147-L182 – santuxus

+0

C'è qualche altra soluzione piuttosto che usare shoulda -matchers gemma? – indb

Problemi correlati