Глобальные переменные не приветствуются, как в RSpec, так и в целом.Вот почему:
Изменение глобальной переменной в любом месте влияет на код повсюду.
Таким образом, если тест когда-либо изменял переменную $now
, на все последующие тесты повлияютмодификация.Это может привести к очень сложным отладкам тестовых сбоев.Трудно отлаживать, потому что тест будет правильным.Но ценность глобальная не будет.Таким образом, вы не можете найти ошибку в тестах путем простого осмотра.Вам придется отлаживать его во время выполнения.
Автоматизированные тесты должны быть независимы друг от друга.Вот почему RSpec имеет лениво выполненный оператор let
.let
позволяет определить переменную в контексте отдельного примера.Вот что говорят RSpec docs :
Используйте let, чтобы определить запомненный вспомогательный метод.Значение будет кэшировано для нескольких вызовов в одном и том же примере, но не во всех.
Это означает, что если вы определите now
следующим образом:
let(:now) { DateTime.parse('2020-01-01 00:00:01 -0500') }
значение гарантировано будет точно таким, как вы говорите, в каждом тесте.Поскольку значение запоминается для каждого отдельного примера, один тест никогда не может повлиять на значение, полученное другим тестом при выполнении.
Если вы все еще не уверены, я бы рекомендовал использовать глобальную константу над глобальной переменной,По крайней мере, тогда Ruby предупредит вас, если вы попытаетесь изменить значение.