2012-03-12 13 views
6

Ho una classe utente con una e-mail che è unico, ma come ambito l'inquilino:test unicità in un ambito in un progetto Rails utilizzando shoulda (ma non RSpec)

class User < ActiveRecord::Base 
    validates :email, :uniqueness => {:scope => :tenant_id, :allow_blank => true} 
    #... 
end 

sto cercando di testarlo con:

class UserTest < ActiveSupport::TestCase 
    context "a user" do 
    setup { @user = create :user } 
    subject { @user } 

    should validate_uniqueness_of(:email).scoped_to(:tenant_id) 
    end 
end 

ma il test non riesce con questo messaggio:

errori dovrebbe includere "è già stata presa" quando e-mail è impostato su "[email protected] xample.com ", ha ottenuto errori: [" l'email è già stata presa (\ "[email protected] \") "," first_name non può essere vuoto (nil) "," last_name non può essere vuoto (nil) "] (con valore diverso di tenant_id)

che solleva molte domande. Perché il messaggio di errore non corrisponde? Sembra che il vero indirizzo email sia incluso nel messaggio di errore, ma perché è incluso? Quando ho generare l'errore dall'interfaccia utente non sembra essere inclusi:

enter image description here

Inoltre, alla fine mi dice che sta cercando con un inquilino diverso, che se fosse vero, si shouldn generare qualsiasi errore (non avviene quando eseguo l'app stessa), ma perché si aspetta l'errore? Dovrebbe aspettarsi l'errore solo se è lo stesso tenant_id.

Questo è così confuso. Qualche idea su cosa sta succedendo e/o su come testarlo correttamente?

risposta

15

Ho appena incontrato questo stesso problema. Siamo stati in grado di risolvere cambiando

should validate_uniqueness_of(:email).scoped_to(:tenant_id) 

a

should validate_uniqueness_of(:email_id).scoped_to(:tenant_id) 

Non so se è esattamente la stessa situazione, ma a quanto pare il nostro problema è stato causato da risorse nidificate gettando il matcher per un ciclo in qualche modo .

0

Trovo che scoped_to abbia problemi oscuri con alcuni test. Ogni volta che si incontra, diventa necessario scrivere più test dettagliati e testare manualmente l'errore di creare un oggetto nello stesso ambito.