2015-05-11 7 views
9

Come si scrive una specifica per verificare se un nuovo record viene creato nel database dopo una registrazione utente avvenuta con successo? Usando rspec in Rails 4 con le gemme capybara, factorygirl e database_cleaner.Come scrivere una specifica per verificare se un record è salvato nel database usando rspec con Rails 4?

Mi sento come se questa situazione fosse comune e una risposta dovrebbe essere facile da trovare, ma non ho potuto trovarne una qui o tramite google.

+0

look per "aspettarsi {}. {} Per cambiare" –

risposta

17

Probabilmente si desidera il change matcher

Potrai fare qualcosa di simile:

expect { 
    post :create, :user => {:user => :attributes } 
}.to change { User.count } 

Nota: un Gotcha con questo matcher è che queste sono davvero le parentesi graffe in entrambi i posti!

Questo codice dice:

si aspettano che l'esecuzione di questo primo blocco di codice per modificare il valore che provo quando corro quel blocco di codice

ed è funzionalmente equivalente alla scrittura:

before_count = User.count 
post :create, :user => {:user => :attributes } 
expect(User.count).not_to eq(before_count) 
+0

grazie. questo dovrebbe farlo – jeffhale

+0

Anche se sono d'accordo, l'aspetto effettivo delle tue specifiche (se si tratta di una funzionalità specifica) sarà probabilmente più simile a quello che ha detto l'altro - con l'aspettativa del clic sul pulsante di registrazione. Il mio esempio è più simile a un controller-spec, ma offre una panoramica di come funziona il change-matcher in generale;) –

+0

Ciò non aiuta a verificare se un oggetto presente è stato aggiornato correttamente. Nel caso in cui l'oggetto fosse presente nel database prima delle modifiche, non cambierà il conteggio. – Ekkstein

8

Dato che hai menzionato capibara, quindi presumo che tu voglia una funzionalità specifica, ovviamente avrai bisogno di cambiare i dettagli per abbinare la tua appl icazione

require 'rails_helper' 
feature 'Users' do # or whatever 
    scenario 'creating an account' do 
    visit root_path 
    click_link 'Sign Up' 
    fill_in 'Name', with: 'User 1' 
    fill_in 'Email', with: '[email protected]' 
    fill_in 'Password', with: 'password' 
    expect{ 
     click_button 'Sign up' 
    }.to change(User, :count).by(1) 
    end 
end 
2

Come si utilizza factorygirl, è possibile utilizzare factorygirl per creare dati di test

FactoryGirl.define do 
factory :user do 
    sequence(:name) { |n| "user #{n}" } 
    sequence(:email) { |n| "sampleuser+#{n}@sampleuser.com" } 
    password '123456789' 
end end 

è possibile utilizzare 'FactoryGirl.create (: utente)' ogni volta che si desidera un record utente.

Per testare è possibile scrivere spec come questo

expect{ 
     post :create, {user: FactoryGirl.attributes_for(:user)} 
    }.to change(User, :count).by(1) 
Problemi correlati