2014-02-18 3 views
1

У меня есть тест, который немного похож на следующий. Детали не важны, но у меня есть метод, который занимает около 10 секунд, и возвращает некоторые данные, которые я хочу использовать кучу раз в кучу тестов. Данные не будут более свежими - мне нужно только один раз извлечь их. Мое понимание let состоит в том, что оно memoizes, поэтому я ожидал бы следующего, чтобы только вызвать 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 

Когда я запускаю тест, я вижу ЗВОНОК МЕНЯ! столько раз, сколько у меня есть утверждения или использовать slowthing.

+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

Спасибо - я полагался на память ... моя вина. – bbcmicro

+0

@bbcmicro Это был другой пример, поэтому он не был замечен. –

Смежные вопросы