2014-02-18 120 views
1

我有一個測試,有點像下面。細節並不重要,但我有一種方法需要大約10秒鐘,並在一系列測試中取回一些我想要使用的數據。數據不會更新鮮 - 我只需要一次獲取它。我對let的理解是記憶,所以我期望以下只調用一次slow_thing。但我認爲它多次被稱爲慢物。我究竟做錯了什麼?爲什麼不是rspec記憶這個?

describe 'example' do 

    def slow_thing 
    puts "CALLING ME!" 
    sleep(100) 
    end 

    let(:slowthing) { slow_thing } 

    it 'does something slow' do 
    expect(slowthing).to be_true 
    end 

    it 'does another slow thing' do 
    expect(slowthing).to be_true 
    end 

end 

當我運行測試時,我看到CALLING ME!儘可能多的我聲稱或使用緩慢的東西。

+0

使用'前(:所有)'代替 – bjhaid

回答

5

文檔狀態值是跨例子緩存:

值將跨越多個呼叫被緩存在相同的例子但不能跨越例子。 [重點煤礦]

例如,還從文檔:

$count = 0 
describe "let" do 
    let(:count) { $count += 1 } 

    it "memoizes the value" do 
    count.should == 1 
    count.should == 1 
    end 

    it "is not cached across examples" do 
    count.should == 2 
    end 
end 

https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/helper-methods/let-and-let

+0

謝謝 - 我是靠記憶... mea culpa。 – bbcmicro

+0

@bbcmicro這是一個不同的例子,所以它不被記憶。 –