2016-09-27 5 views
2

Это говорит в "RSpec Core 3.5":Как использовать «мемонирование» rpsec?

Использование let определить memoized вспомогательного метода

Я не считаю их пример очень ясно. Говорят ли, что выражение для :count оценивается только один раз для спецификации и снова между каждой спецификацией?

Мне интересно узнать, как memoization с let будет работать с объектом ActiveRecord.

+0

Добро пожаловать в Переполнение стека. Пожалуйста, прочитайте «[ask]», особенно «[Как задавать вопросы Smart Way] (http://catb.org/esr/faqs/smart-questions.html)». Грамматика важна для переполнения стека. Мы создаем справочник, поэтому, пожалуйста, постарайтесь использовать проверку орфографии и правильное форматирование. –

ответ

4

Говорят, что выражение для: count оценивается только для спецификации и снова между каждой спецификацией?

ответ от docs:

Значение будет кэшируются на несколько вызовов в том же примере, но не через примеры.

Так что да, он будет оцениваться один раз для каждого примера.

Иными словами, значение будет оцениваться один раз за it.

Я нахожу их пример очень выразительным, смотрите:

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

    # count will not change no matter how many times we reference it in this it block 
    it "memoizes the value" do 
    expect(count).to eq(1) # evaluated (set to 1) 
    expect(count).to eq(1) # did not change (still 1) 
    end 

    # count will be set to 2 and remain 2 untill the end of the block 
    it "is not cached across examples" do 
    expect(count).to eq(2) # evaluated in new it block 
    end 
end 

Мы ссылаемся count дважды в memoizes the value примере, но она была оценена только один раз.