Поведение rspec let с FactoryGirl

Я пытаюсь использовать FactoryGirl для создания нескольких элементов для одной из моих спецификаций контроллера:

Выдержка:

describe ItemsController do
    let(:item1){Factory(:item)}
    let(:item2){Factory(:item)}

    # This fails. @items is nil because Item.all returned nothing
    describe "GET index" do
        it "should assign all items to @items" do
            get :index
            assigns(:items).should include(item1, item2)
        end
    end

    # This passes and Item.all returns something 
    describe "GET show" do
        it "should assign the item with the given id to @item" do
            get :show, id => item1.id 
            assigns(:item).should == item1
        end
    end
end

Когда я изменяю, это позволяет:

before(:each) do
    @item1 = Factory(:item)
    @item2 = Factory(:item)
end

и я ставил @s перед переменными, все работает. Почему версия не работает? Я попробовал изменить разрешение, чтобы позволить! S и видеть идентичное поведение.

1
nl ja de

1 ответы

let(:item1) { FactoryGirl.create(:item) }
let(:item2) { FactoryGirl.create(:item) }

Фактически, когда вы делаете let (: item1), он будет делать ленивую загрузку, создать объект в памяти, но не сохранять его в базе данных, а когда вы это сделаете

@item1 = Factory(:item)

он создаст объект в базе данных.

Попробуй это:

describe ItemsController do
    let!(:item1){ Factory(:item) }
    let!(:item2){ Factory(:item) }

    describe "GET index" do
        it "should assign all items to @items" do
            get :index
            assigns(:items).should include(item1, item2)
        end
    end

    describe "GET show" do
        it "should assign the item with the given id to @item" do
            get :show, id => item1.id 
            assigns(:item).should == item1
        end
    end
end

let никогда не будет создан, если вы его не назовете, в то время как (: let!) подвергается сильной оценке перед каждым вызовом метода.

или вы можете сделать это:

describe ItemsController do
    let(:item1){ Factory(:item) }
    let(:item2){ Factory(:item) }

    describe "GET index" do
        it "should assign all items to @items" do
            item1, item2
            get :index
            assigns(:items).should include(item1, item2)
        end
    end

    describe "GET show" do
        it "should assign the item with the given id to @item" do
            get :show, id => item1.id 
            assigns(:item).should == item1
        end
    end
end
7
добавлено
вы можете принять ответ, если он ответил на вопрос
добавлено автор Muhamamd Awais, источник
Привет, спасибо за ваше предложение. Это не устранило проблему. В конце мой вопрос говорит, что я уже пробовал это.
добавлено автор mushroom, источник