2015-07-24 10 views
5

Oto mój test. Błąd, który dostaję, to ActiveRecord :: RecordNotFound: Nie można znaleźć programu MedicalStudentProfile z parametrem "id" = 1001. Czy używam build_stubbed poprawnie?FactoryGirl build_stubbed & RSpec - Generuje identyfikator, ale nie odnajduje id podczas testowania Pokaż działanie

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 

Odpowiedz

6

build_stubbed nie zapisać rekord do bazy danych, to po prostu fałszywe ActiveRecord przypisuje identyfikator do modelu i odcinki spośród Database metody interakcji (takie jak zapis), takie, że test podnosi wyjątek, jeśli są wywoływane. Spróbuj użyć:

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

+1

Dzięki. Sprawdziłem w build_stubbed, aby przyspieszyć testy kontrolerów, ale wydaje się, że nie ma tu zastosowania. –

+0

Możesz sfałszować lub przeszukać metodę find klasy MedicalStudentProfile, aby uniknąć uderzenia bazy danych. W ten sposób używasz makiet, aby określić zachowanie kontrolera zamiast oczekiwać wyniku bazy danych. Zdecydowanie polecam [Receptury testowe Rails 4] (http://www.amazon.com/Rails-Test-Prescriptions-Healthy-Codebase/dp/1941222196/ref=sr_1_1?s=books&ie=UTF8&qid=1437766269&sr=1- 1 & słowa kluczowe = tory + 4 + test + recepty) zarezerwuj, jeśli chcesz dowiedzieć się więcej na ten temat. – izaban

+0

Widzę, jak kpina z DB jest dobra dla wydajności testu, ale czy tego rodzaju porażka nie jest celem testu integracyjnego? – max

2

build_stubbed nie zapisuje rekordu do bazy danych - to po prostu stubs model działa jak to zostało utrwalone. Jest to świetne rozwiązanie w przypadku specyfikacji modelu lub innych scenariuszy, w których użytkownik nie wchodzi w interakcję z bazą danych.

Jednak w przypadku żądania i specyfikacji kontrolera należy użyć create, aby kontrolerzy mogli załadować rekordy z bazy danych.

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

Dzięki! Nie byłem pewien, czy można ich użyć do specyfikacji kontrolera. –

Powiązane problemy