2012-07-27 17 views
23

Ich bin neu mit RSpec zum Schreiben von Tests in einer Rails-Anwendung, die eine MySQL-Datenbank verwendet. Ich habe meine Leuchten definiert und sich in meinem spec bin Laden wie folgt:Fixtures in RSpec

before(:all) do 
    fixtures :student 
end 

Hat speichert diese Erklärung, die in meinen Spielen im Studenten-Tabelle definierten Daten oder ist es nur die Daten in der Tabelle laden, während die Tests ausgeführt und entfernt es von der Tabelle, nachdem alle Tests ausgeführt werden?

+10

Anstelle von Fixtures versuchen Sie [factory_girl] (http://www.fabricationgem.org/) oder [fabrication] (http://www.fabricationgem.org/). –

Antwort

-1

Es hängt davon ab, wie Sie RSpec konfigurieren. Weitere Informationen finden Sie unter here

1

before(:all) hält die genauen Daten, wie es einmal geladen/erstellt wurde. Du machst dein Ding und am Ende des Tests bleibt es. Deshalb hat buis Link after(:all) zu zerstören oder before(:each); @var.reload!;end zu verwenden, um die spätesten Daten von den Tests vorher zu erhalten. Ich kann diesen Ansatz in geschachtelten rspec beschreiben Blöcke sehen.

16

Wenn Sie mit RSpec Leuchten verwenden, geben Sie Ihre Armaturen im Block beschreiben, nicht innerhalb eines vorher Block:

describe StudentsController do 
    fixtures :students 

    before do 
    # more test setup 
    end 
end 

Ihre Schüler Geräte werden in den Studenten-Tabelle geladen werden und dann auf die zurückgerollt Ende jedes Tests mit Datenbanktransaktionen.

+1

https://www.relishapp.com/rspec/rspec-rails/docs/model-specs/transactional-examples#run-in-transactions-with-fixture – nruth

3

Zu allererst: Sie können keine Methode fixtures in :all/:context/:suite hook. Versuchen Sie nicht, Vorrichtungen in diesen Haken zu verwenden (wie post(:my_post)).

Sie können Fixtures nur im describe/context Block erstellen, während Infuse früher schreibt.

Anruf

fixtures :students, :teachers 

Legen Sie keine Daten in DB! Just bereitet Helper Methoden und teachers. Geforderte Datensätze werden in dem Moment, in dem Sie versuchen, auf sie zuzugreifen, langsam geladen. Kurz vor

dan=students(:dan) 

Dies wird in delete all from table + insert fixtures Weise Schüler und Lehrer laden.

Also, wenn Sie einige Studenten in vor (Kontext) Haken vorbereiten, werden sie jetzt weg sein !!

Einfügen von Datensätzen erfolgt nur einmal in Testsuite.

Datensätze von Fixtures werden am Ende der Testsuite nicht gelöscht. Sie werden gelöscht und beim nächsten Testlauf wieder eingefügt.

Beispiel:

#students.yml 
    dan: 
    name: Dan 
    paul: 
    name: Paul 

#teachers.yml 
    snape: 
     name: Severus 




describe Student do 
    fixtures :students, :teachers 

    before(:context) do 
    @james=Student.create!(name: "James") 
    end 

    it "have name" do 
    expect(Student.find(@james.id).to be_present 
    expect(Student.count).to eq 1 
    expect(Teacher.count).to eq 0 

    students(:dan) 

    expect(Student.find_by_name(@james.name).to be_blank 
    expect(Student.count).to eq 2 
    expect(Teacher.count).to eq 1 

    end 
end 


#but when fixtures are in DB (after first call), all works as expected (by me) 

describe Teacher do 
    fixtures :teachers #was loade in previous tests 

    before(:context) do 
    @james=Student.create!(name: "James") 
    @thomas=Teacher.create!(name: "Thomas") 
    end 

    it "have name" do 
    expect(Teacher.find(@thomas.id).to be_present 
    expect(Student.count).to eq 3 # :dan, :paul, @james 
    expect(Teacher.count).to eq 2 # :snape, @thomas 

    students(:dan) 

    expect(Teacher.find_by_name(@thomas.name).to be_present 
    expect(Student.count).to eq 3 
    expect(Teacher.count).to eq 2 

    end 
end 

Alle Erwartungen oben in Tests

Wenn diese Prüfung bestehen erneut ausgeführt werden (in der nächsten Suite) und in dieser Reihenfolge als Erwartung

expect(Student.count).to eq 1 

wird nicht erfüllt! Es wird 3 Studenten geben (: dan,: paul und fresh new @james). Alle werden vor students(:dan) gelöscht und nur: paul und: dan wird wieder eingefügt.

+1

Yeah! Ich fand den Trick, alle Fixtures vor allen Tests zu laden. Fügen Sie einfach RSpec.configure {| config | hinzu config.global_fixtures =: all} UND test direkt in spec_helper, der versucht, auf jedes Fixture zuzugreifen. Auf diese Weise werden alle Fixtures im voraus geladen. – Foton