2015-07-24 3 views
5

Hier ist mein Test. Der Fehler, den ich erhalte, ist ActiveRecord :: RecordNotFound: MedicalStudentProfile konnte mit 'ID' = 1001 nicht gefunden werden. Benutze ich Build_stubbed korrekt?FactoryGirl build_stubbed & RSpec - Erzeugt ID, aber ID beim Testen nicht gefunden Aktion anzeigen

RSpec-Test

RSpec.describe MedicalStudentProfilesController, type: :controller do 

let!(:profile){build_stubbed(:medical_student_profile)} 
let!(:user){build_stubbed(:user)} 

describe 'GET show' do 

    it 'should show the requested object' do 
    sign_in user 
    get :show, id: profile.id 
    expect(assigns(:profile)).to eq profile 
end 
end 

end 

-Controller

def show 
@profile = MedicalStudentProfile.find params[:id] 
end 

Antwort

6

build_stubbed nicht den Datensatz in die Datenbank nicht speichern, weist es nur eine gefälschte Active-ID an das Modell und Stubs aus Datenbank Interaktionsmethoden (wie Speichern), so dass der Test beim Aufruf eine Ausnahme auslöst. Versuchen Sie es mit:

let!(:profile){create(:medical_student_profile)}

+1

Danke. Ich habe in build_stubbed nachgesehen, um die Controller-Tests zu beschleunigen, aber es scheint hier nicht anwendbar zu sein. –

+0

Sie können die Find-Methode der MedicalStudentProfile-Klasse nachahmen oder stubben, um den Datenbanktreffer zu vermeiden. Auf diese Weise verwenden Sie Mocks, um das Verhalten Ihres Controllers anzugeben, anstatt ein Datenbankergebnis zu erwarten. Ich empfehle Ihnen definitiv die [Rails 4 Test Rezepte] (http://www.amazon.com/Rails-Test-Prescriptions-Healthy-Codebase/dp/1941222196/ref=sr_1_1?s=books&ie=UTF8&qid=1437766269&sr=1- 1 & keywords = Schienen + 4 + Test + Rezepte) buchen, wenn Sie mehr darüber erfahren möchten. – izaban

+0

Ich verstehe, wie gut die Leistung der DB für die Testleistung ist, aber ist das nicht der Zweck eines Integrationstests? – max

2

build_stubbed nicht den Datensatz in die Datenbank nicht speichern - es Stummel einfach ein Modell zu handeln, wie es beharrte wurde. Dies ist ideal für Modellspezifikationen oder andere Szenarien, in denen Sie nicht wirklich mit der Datenbank interagieren.

Aber für Anfrage und Controller-Spezifikationen müssen Sie create verwenden, damit Ihre Controller die Datensätze aus der Datenbank laden können.

let!(:profile){ create(:medical_student_profile) } 
let!(:user){ create(:user) } 
+0

Danke! Ich war mir nicht sicher, ob man sie für Controller-Spezifikationen verwenden könnte. –