2014-10-15 1 views
0

Я использую заводскую девушку для создания своих объектов. Я задаюсь вопросом, почему я должен сделать следующее:Rspec Change Matcher и заводская девушка

RSpec.describe V1::SlotsController, type: :controller do 
    let(:valid_slot) { create(:slot) } 
    let(:valid_attributes) { attributes_for(:slot) } 

    describe "DELETE destroy" do 
    it "destroys the requested slot" do 
     slot = Slot.create! valid_attributes # not working without this line 
     expect { 
     delete :destroy, { id: slot.id } 
     }.to change(Slot, :count).by(-1) 
    end 
    end 
end 

Если я не перезаписывать слот, и использовать только один созданный factory_girl, тест не пройдет. Почему так?

ответ

1

т.к. let есть "lazy loaded". Вы должны использовать

let!(:slot) { create(:slot) } 

describe "DELETE destroy" do 
    it "destroys the requested slot" do 
    expect { 
     delete :destroy, { id: slot.id } 
    }.to change(Slot, :count).by(-1) 
    end 
end 
+0

Удивительный, спасибо. Сохраняется ли (разумно) производительность, чтобы всегда использовать let! (например, GET, PATCH) или использовать его только при необходимости (например, DELETE)? – einSelbst

+0

Вам следует избегать создания ненужных записей в тестах для более быстрого тестирования. В вашем примере перед запуском блока ожидания должен быть создан 'slot'. Но будьте осторожны, здесь 'let!' Выходит из 'описания 'DELETE destroy' ', и если вы добавите больше описаний, тогда' slot' будет создаваться каждый раз, даже если он не используется. – gotva