Это R FAQ . Вам нужно сделать a[3,,drop = FALSE]
.
Глобальные переменные не приветствуются, как в RSpec, так и в целом. Вот почему:
Изменение глобальной переменной в любом месте влияет на код везде.
Таким образом, если тест когда-либо изменял переменную $now
, модификация затронула бы все последующие тесты. Это может привести к очень сложным отладкам тестовых сбоев. Трудно отлаживать, потому что тест будет правильным. Но ценность глобальная не будет. Таким образом, вы не можете найти ошибку в тестах путем простого осмотра. Вам придется отлаживать его во время выполнения.
Автоматизированные тесты должны быть независимы друг от друга. Вот почему RSpec имеет лениво выполненный оператор let
. let
позволяет определить переменную в контексте одного примера. Вот что говорят RSpec docs :
Используйте let, чтобы определить запомнившийся вспомогательный метод. Значение будет кэшировано для нескольких вызовов в одном и том же примере, но не во всех.
blockquote>Это означает, что если вы определите
now
следующим образом:let(:now) { DateTime.parse('2020-01-01 00:00:01 -0500') }
Это значение будет точно таким, как вы говорите, в каждом отдельном тесте. Поскольку значение запоминается для каждого отдельного примера, один тест никогда не может повлиять на значение, которое другой тест получает при выполнении.
Если вы все еще не уверены, я бы порекомендовал использовать глобальную константу над глобальной переменной. По крайней мере, Ruby предупредит вас, если вы попытаетесь изменить значение.
Это плохая идея. На самом деле, вы должны избегать использования глобальных переменных в любом месте вашего кода.
Вы можете использовать перед блоком, чтобы установить любую переменную, которую нужно использовать вместе с вашими примерами тестов.
Пример:
describe Thing do
before(:each) do
@now = DateTime.parse('2020-01-01 00:00:01 -0500')
end
describe "initialized in before(:each)" do
it "example 1" do
// here @now is available
end
it "example 2" do
// here @now is also available
end
end
end