2013-06-04 16 views
1

在rspec的試運行,我試圖初始化兩個變量測試運行之前如下「前:每個做」塊沒有在rspec的

describe "Publishing" do 
    before :each do 
     page_published = Page.create(attributes_for(:page)) 
     page_unpublished = Page.create(attributes_for(:page_unpublished)) 
    end 
    it "returns published pages" do 
     expect(Page.published).to eq [page_published] 
    end 
    it "returns unpublished pages" do 
     expect(Page.unpublished).to eq [page_unpublished] 
    end 
    end 

當我這樣做,我得到一個錯誤:

1) Page Publishing returns unpublished pages 
    Failure/Error: expect(Page.unpublished).to eq [page_unpublished] 
    NameError: 
     undefined local variable or method `page_unpublished' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_4:0x0000010355b8c0> 

但是,如果我在每個塊中定義變量,則不會有錯誤。例如:

describe "Publishing" do 
    it "returns published pages" do 
     page_published = Page.create(attributes_for(:page)) 
     expect(Page.published).to eq [page_published] 
    end 
    it "returns unpublished pages" do 
     page_unpublished = Page.create(attributes_for(:page_unpublished)) 
     expect(Page.unpublished).to eq [page_unpublished] 
    end 
    end 

爲什麼變量中的「before:each do」塊中沒有聲明變量?

回答

3

因爲你聲明它們是each塊的本地變量,它立即超出範圍。您需要將它們聲明爲實例變量,以使其可用於其他方法:

before :each do 
    @page_published = Page.create(attributes_for(:page)) 
    @page_unpublished = Page.create(attributes_for(:page_unpublished)) 
end 
+0

正確,謝謝 –

1

meagar是正確的。但是,這也是一個使用let!塊的主要地方,因此它可以:

describe "Publishing" do 

    let! :page_published { Page.create(attributes_for(:page)) } 
    let! :page_unpublished { Page.create(attributes_for(:page_unpublished)) } 

    it "returns published pages" do 
     expect(Page.published).to eq [page_published] 
    end 
    it "returns unpublished pages" do 
     expect(Page.unpublished).to eq [page_unpublished] 
    end 
    end 
相關問題