2012-03-27 3 views
2

Ich benutze Ruby 1.9.2 und Schienen 3.2.2.RSpec Test wird nicht bestanden. Validieren für die Eindeutigkeit mit dem Domain-Namen

Ich habe ein 'Domain' Modell (domain.rb):

class Domain < ActiveRecord::Base 
    attr_accessible :url 
    belongs_to :user 

    VALID_DOMAIN_REGEX = /^[a-z0-9\-\.]+\.[a-z]{2,}$/i 
    validates :url, presence:true, 
       format: { with: VALID_DOMAIN_REGEX }, 
       uniqueness: { case_sensitive: false } 

end 

Und einen Test zu behaupten, dass eine doppelte Domäne nicht gültig sein sollte:

require 'spec_helper' 

describe Domain do 

    before do 
    @domain = FactoryGirl.create(:domain) 
    end 

    subject { @domain } 

    describe "when domain url is already taken" do 
    before do 
     domain_with_same_url = @domain.dup 
     domain_with_same_url.url = @domain.url.upcase 
     domain_with_same_url.save 
    end 
    it { should_not be_valid } 
    end 
end 

Der Test nicht hält:

1) Domain when domain url is already taken Failure/Error: it { should_not be_valid } expected valid? to return false, got true # ./spec/models/domain_spec.rb:31:in `block (3 levels) in '

Antwort

3

@domain wurde bereits erstellt, validiert und gespeichert.

Die domain_with_same_url ist der neue Datensatz, und es sollte ungültig sein. Aber Sie überprüfen es nicht.

Versuchen

domain_with_same_url = FactoryGirl.create(:domain, :url => @domain.url.upcase) 
domain_with_same_url.should_not be_valid 
+0

Danke für die Hilfe! Erkenne jetzt, dass ich konzeptionell einen großen Gegenstand vermisste :) Sollte mir helfen, mit diesem Testmaterial weiterzumachen. – jessem

0

Ihre zwei before Blöcke in äußeren zu den inneren Ordnung laufen. Wenn Sie also Ihre Testsuite ausführen, wird zuerst Ihr @domain Objekt erstellt und gespeichert, dann wird der innere before Block ausgeführt. Hiwever, Ihre domain_with_same_url wird wahrscheinlich nie tatsächlich gespeichert, weil es Validierung fehlschlägt, die wahrscheinlich zu domain_with_same_url.save führt, um falsch zurückzugeben.

Als Workaround konnten Sie die Gültigkeit von domain_with_same_url anstelle von @domain überprüfen.

0

Scheint wie Ihre subject Ihres Testfalles ist @domain, die ein gültiges Objekt ist. Ob Sie ein neues Thema für @domain_with_same_url verwenden (vergessen Sie nicht, eine Instanzvariable zu machen), oder sagen Sie explizit domain_with_same_url.should ... (genau wie The Who in seiner Antwort angegeben).

0

Ich hatte gerade das gleiche Problem in Rails 4 Model column uniqueness not working. Es bietet zwei weitere Lösungen ohne einen zweiten Aufruf von FactoryGirl, nur zur Information. Die, die ich benutze, ist:

Die Speicherung verursacht einige Probleme, die für mich unerwartet sind. Und Sie müssen ein Objekt als lokale Variable auf should_not_be_valid verweisen.

Verwandte Themen