2016-04-05 7 views
1

ich (meistens) nach einem Tutorial everydayrails.com versucht, einen Test zu schreiben, dass mein Benutzermodell zeigt erfordert eine E-Mail:Rspec Test nicht zeigen, dass Modell erfordert eine E-Mail

17 it "requires an email" do 
18  user = FactoryGirl.create(:user, email: nil) 
19  expect(user).to_not be_valid 
20 end 

Aber diese versagen .. . weil mein Benutzermodell eine E-Mail benötigt?

Failures: 

    1) User requires an email 
    Failure/Error: user = FactoryGirl.create(:user, email: nil) 

    ActiveRecord::RecordInvalid: 
     Validation failed: Email can't be blank 
    # ./spec/models/user_spec.rb:18:in `block (2 levels) in <top (required)>' 

Was mache ich hier falsch?

Antwort

1

Ihr Anruf zu Factory.create läuft die Validierungen und intern Fabrik Mädchen verwendet save! Standardmäßig bewirkt die fehlgeschlagene Validierung, dass eine Ausnahme ausgelöst wird.

Verwenden Factory.build statt (wie im Tutorial Sie verlinkt auf) ein nicht gespeicherte Objekt zu erstellen, die Sie für die Gültigkeit testen

0

Sie diesen Test wie auf diese Weise versuchen kann

it "requires an email" do 
    expect(User.new.errors_on(:email)).to include("can't be blank") 
end 

oder

expect(Factory.build(:user, email: nil)).to_not be_valid 

Mehr dazu entnehmen Sie bitte errors_on

0

Die wichtigsten Dinge, die ich empfehlen würde, wenn die Tests in der Zukunft zu schreiben sind:

  • Lesbar. Tests sollten wirklich einfach zu lesen (und schreiben) sein.
  • Umfangreich. Tests sollten nicht unnötig brechen und sollten genau das testen, was Sie benötigen.

Das Codebeispiel, das Sie gesucht werden würde, ist:

context "Email address" do 
    it 'does not validate if email is nil' do 
    user_with_no_email = build(:user, email: nil) 

    expect(user_with_no_email).to receive(:validate).with(false) 
    expect(user_with_no_email).to have(1).error_on(:email) 
    end 
end 
Verwandte Themen