2013-01-02 13 views

Odpowiedz

14

zawsze wolą pozwolić na zmiennej instancji na kilka powodów:

  • Zmienne instancji zaistnieć kiedy się odwoływać który oznaczało, że jeśli popełnisz żadnego błędu w przypadku zmienna pisowni następnie to Zdecydowanie poprowadziłoby Cię to do pewnych problemów, ponieważ zmienna nowej instancji została zainicjowana do zera. Ale pozwól, że otrzymasz NameError, jeśli pominiesz go.

  • Dalsze będzie inicjowanie zmiennych instancji przed bloku, co oznacza, że ​​przed blok zostanie wykonany za każdym razem Spec byłoby nawet jeśli ta specyfikacja nie używać tych zmiennych instancji zostały zainicjowane. przykład podany poniżej;

    before do 
        @user = Factory :user 
        @movie = Factory :movie 
    end 
    
    it "should have user" do 
        @user.should eq User.first 
    end 
    
    it "should have movie" do 
        @movie.should eq Movie.first 
    end 
    

Chociaż wszystkie specyfikacje uruchomić w porządku, ale nie ma zastosowania @movie w pierwszej specyfikacji i bez użycia @user w sekundę.

Możesz również użyć let with bang "!" let!, let się leniwie oceniane i nigdy nie zostanie instancja, jeśli nie nazwać, użyj let zdefiniować memoized pomocnika, a let! jest mocno oceniane przed każdym wywołaniu metody.

+2

Może chciał powiedzieć tak: we wszystkich punktach, 'let' korzystne jest zmienne instancji i jest zawsze bardziej korzystny niż zmiennych instancji. –

7

Ja faworyzowałem to pytanie, ale na końcu sam odpowiadam na to pytanie.

pierwsze opisać różnice

Sposób let stosowany nie zainicjować zmienną, dopóki nie zostanie wymieniony w teście - co sprawia, że ​​różni się od @instance variables które są inicjowane od samego początku.

Generalnie nie ma dużej niepewności. Użyj @instance variables, jeśli chcesz się upewnić, że zainicjowano obiekt let. Ale z drugiej strony można to zrobić tak samo z let!, więc nie ma oczywistego powodu, aby używać @instance variable.

Podsumowując, dla mnie, jest oczywiste powodów, by używać @instance variable nad let, ale nie ma żadnego oczywistego powodu, aby użyć @instance variables nad let!

@instance variables zajmuje więcej czasu, aby załadować, a stosując je, można prowadzić do niepożądanego złożoności kodu, który można by uniknąć stosując let lub let!

można spojrzeć na tych dwóch odpowiedzi, jak również, a może to daje trochę więcej informacji:

When to use RSpec let()?

RSpec: What is the difference between let and a before block?

Powiązane problemy