Можно ли отменить определение переменной в ruby? - PullRequest
6 голосов
/ 04 декабря 2008

В ruby, есть ли способ "отменить определение" переменной или константы после ее определения?

В наших средах rails мы определяем одну из трех констант как true, в зависимости от среды: TESTING, DEVELOPMENT или PRODUCTION. Затем в коде контроллера мы используем defined?, чтобы увидеть, в какой среде мы находимся, то есть: defined? PRODUCTION.

Теперь я хочу провести модульное тестирование некоторых из этих специфических для среды действий. Моя первоначальная попытка состояла в том, чтобы просто установить подходящую константу в моем тесте, а затем сбросить их при разборке. Тем не менее, я не могу понять, как сбросить DEVELOPMENT и PRODUCTION так, чтобы defined? вернул false.

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

РЕДАКТИРОВАТЬ: Я понимаю, что это определенно НЕ правильный способ сделать вещи. Увы, изменить это нетривиальная задача, поэтому я ищу простой способ просто протестировать то, что там сейчас. Кроме того, мне также любопытен вопрос о языке нижнего уровня о том, возможно ли отменить определение переменной / константы.

Ответы [ 4 ]

8 голосов
/ 04 декабря 2008

Я нашел этот ответ

Object.send(:remove_const, "TESTING")

Если я правильно помню, использование send - это своего рода хак, потому что remove_const - это действительно закрытый метод. Вы хотите спросить себя, зачем вам нужно определять константы ПРОИЗВОДСТВО, РАЗВИТИЕ и ТЕСТИРОВАНИЕ одновременно, когда они действительно являются взаимоисключающими; вот почему я проголосовал против grepsedawk. ​​

5 голосов
/ 04 декабря 2008

Ну, я думаю, потому что это помечено RubyOnRails, о котором мы сейчас говорим о Rails ... среда уже хранится в RAILS_ENV, поэтому что-то вроде этого работает просто отлично ...

if (RAILS_ENV == "production") ...

Полагаю, вы могли бы написать это так:

RAILS_ENV.include?("development")
3 голосов
/ 04 декабря 2008

Нет смысла использовать три истинные / ложные переменные для условий, которые являются взаимоисключающими. Что происходит, например, если и РАЗРАБОТКА и ПРОИЗВОДСТВО установлены одновременно.

Вместо этого, используйте одну переменную, которая указывает, в какой среде вы находитесь, устанавливая ENVIRON в один из наборов (DEV, TEST, PROD) или что-то подобное.

Затем вы можете просто сравнить ENVIRON с одним из трех для каждого действия, которое вы хотите выполнить.

1 голос
/ 04 декабря 2008

Вместо проверки каждой константы, почему бы не сделать что-то вроде:

environment = :TESTING

if(environment == :TESTING)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...