Хорошо ли использовать глобальные переменные в спецификации? - PullRequest
0 голосов
/ 27 февраля 2019

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

Я хочу использовать эту переменную в моих тестах.И определите это в spec_helper.rb

$now = DateTime.parse('2020-01-01 00:00:01 -0500')

Это хорошая идея или нет?а почему?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

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

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

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

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

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

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

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

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

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

0 голосов
/ 27 февраля 2019

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

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

Пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...