2016-09-27 2 views
2

Es sagt in "RSpec Core 3.5":Wie "erlaubt" lpsec memoization?

Verwenden let eine memoized Hilfsmethode

ich nicht finden, ihr Beispiel sehr klar zu definieren. Sagen sie, dass der Ausdruck für :count nur einmal für eine Spezifikation und wieder zwischen jeder Spezifikation ausgewertet wird?

Ich bin besonders daran interessiert zu verstehen, wie memoization mit let mit einem ActiveRecord-Objekt funktionieren würde.

+0

Willkommen bei Stack Overflow. Bitte lesen Sie "[fragen]", vor allem "[Fragen an den Smart Way] (http://catb.org/esr/faqs/smart-questions.html)". Grammatik ist wichtig bei Stack Overflow. Wir erstellen ein Nachschlagewerk, also bitte bemühen Sie sich, Rechtschreibprüfung und korrekte Formatierung zu verwenden. –

Antwort

4

sagen sie, dass der Ausdruck für: Zählung nur einmal für eine spec ausgewertet wird, und wieder zwischen jedem spec?

Antwort von docs:

Der Wert wird auf mehrere Anrufe im gleichen Beispiel, aber nicht über Beispiele im Cache gespeichert werden.

Also ja, es wird einmal für jedes Beispiel ausgewertet.

Mit anderen Worten, der Wert wird einmal pro it Block ausgewertet.

Ich finde ihr Beispiel Super ausdruck aussehen:

$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 

Wir verweisen count zweimal in memoizes the value Beispiel, aber es wurde nur einmal ausgewertet.