Хорошо ли использовать глобальные переменные в спецификации?

Это R FAQ . Вам нужно сделать a[3,,drop = FALSE].

0
задан vadus1 27 February 2019 в 16:03
поделиться

2 ответа

Глобальные переменные не приветствуются, как в RSpec, так и в целом. Вот почему:

Изменение глобальной переменной в любом месте влияет на код везде.

Таким образом, если тест когда-либо изменял переменную $now, модификация затронула бы все последующие тесты. Это может привести к очень сложным отладкам тестовых сбоев. Трудно отлаживать, потому что тест будет правильным. Но ценность глобальная не будет. Таким образом, вы не можете найти ошибку в тестах путем простого осмотра. Вам придется отлаживать его во время выполнения.

Автоматизированные тесты должны быть независимы друг от друга. Вот почему RSpec имеет лениво выполненный оператор let. let позволяет определить переменную в контексте одного примера. Вот что говорят RSpec docs :

Используйте let, чтобы определить запомнившийся вспомогательный метод. Значение будет кэшировано для нескольких вызовов в одном и том же примере, но не во всех.

Это означает, что если вы определите now следующим образом:

let(:now) { DateTime.parse('2020-01-01 00:00:01 -0500') }

Это значение будет точно таким, как вы говорите, в каждом отдельном тесте. Поскольку значение запоминается для каждого отдельного примера, один тест никогда не может повлиять на значение, которое другой тест получает при выполнении.

Если вы все еще не уверены, я бы порекомендовал использовать глобальную константу над глобальной переменной. По крайней мере, Ruby предупредит вас, если вы попытаетесь изменить значение.

0
ответ дан aridlehoover 27 February 2019 в 16:03
поделиться

Это плохая идея. На самом деле, вы должны избегать использования глобальных переменных в любом месте вашего кода.

Вы можете использовать перед блоком, чтобы установить любую переменную, которую нужно использовать вместе с вашими примерами тестов.

Пример:

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
0
ответ дан psantos 27 February 2019 в 16:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: