Wygląda na to, że istnieje duże wsparcie dla używania let()
w rspec do inicjowania zmiennych. Jakie są przypadki używania zmiennych instancji (np. @name
)?Kiedy używa zmiennych instancji bardziej korzystne niż przy użyciu let()?
Odpowiedz
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.
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:
RSpec: What is the difference between let and a before block?
Może chciał powiedzieć tak: we wszystkich punktach, 'let' korzystne jest zmienne instancji i jest zawsze bardziej korzystny niż zmiennych instancji. –