2012-03-12 7 views
6

mam klasy użytkownika z wiadomości e-mail, który jest wyjątkowy, ale scoped najemcy:Testowanie wyjątkowość w zakresie w projekcie Rails za pomocą shoulda (ale nie rspec)

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

próbuję go przetestować z:

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 

ale test nie powiedzie się z tej wiadomości:

Oczekiwane błędy włączenia „jest już zajęta”, gdy e-mail jest ustawiony na „[email protected] xample.com ", dostał błędy: [" email został już zajęty (\ "[email protected] \") "," first_name nie może być puste (zero) "," last_name nie może być puste (zero) "] (z inną wartością dzierżawcy)

co budzi wiele pytań. Dlaczego komunikat o błędzie jest niezgodny? Wygląda na to, że rzeczywisty adres e-mail jest zawarty w komunikacie o błędzie, ale dlaczego jest uwzględniony? Kiedy wygenerowania błędu z UI to nie wydaje się być zawarte:

enter image description here

Ponadto, na końcu mówi, że próbuje go z innym lokatorem, który, jeśli to prawda, to powinnam nie generuje żadnego błędu (nie działa, gdy uruchomię samą aplikację), ale dlaczego spodziewa się błędu? Powinien oczekiwać błędu tylko wtedy, gdy jest to ten sam identyfikator najemcy.

To takie zagmatwane. Jakieś pomysły, co się dzieje i/lub jak to właściwie przetestować?

Odpowiedz

15

Wpadłem na ten sam problem. Udało nam się go rozwiązać przez zmianę

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

do

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

Nie wiem, czy to jest dokładnie taka sama sytuacja, ale najwyraźniej nasz problem został spowodowany przez zagnieżdżone zasobów rzucanie dopasowywania do pętli jakoś .

0

Uważam, że scoped_to ma niejasne problemy z niektórymi testami. Kiedykolwiek się go napotka, konieczne staje się napisanie pełniejszych testów i ręczne sprawdzenie nieudanego utworzenia obiektu w tym samym zasięgu.