2008-12-03 8 views
5

Dans ruby, existe-t-il un moyen de "défaire" une variable ou une constante une fois qu'elle a été définie?Est-il possible de défaire une variable dans ruby?

Dans nos rails environemnts, nous définissons un des trois Constantes pour être true, en fonction de l'environnement: TESTING, DEVELOPMENT ou PRODUCTION. Ensuite, dans le code du contrôleur, nous utilisons defined? pour voir dans quel environnement nous sommes, par exemple: defined? PRODUCTION.

Maintenant, je veux tester un peu ce comportement spécifique à l'environnement. Ma première tentative consistait simplement à définir la constante appropriée dans mon test, puis à les réinitialiser dans le démontage. Cependant, je ne peux pas comprendre comment réinitialiser DEVELOPMENT et PRODUCTION de telle sorte que defined? renvoie faux. De toute évidence, une solution consisterait simplement à vérifier si la constante appropriée est également vraie, en plus de vérifier si elle est définie, mais cela nécessitera de toucher une bonne partie du code existant.

EDIT: Je réalise que ce n'est certainement pas la bonne façon de faire les choses. Hélas, le changement est une tâche non triviale, donc je cherche un moyen facile de tester ce qui existe actuellement. De plus, je suis également curieux de savoir s'il est possible de dé-définir une variable/constante.

Répondre

8

J'ai trouvé this answer

Object.send(:remove_const, "TESTING") 

Si je me souviens bien, utiliser send est un peu un bidouillage, parce que remove_const est vraiment une méthode privée. Vous voulez vous demander pourquoi vous devez définir les constantes PRODUCTION, DEVELOPPEMENT et TEST en même temps alors qu'elles s'excluent mutuellement? C'est pourquoi j'ai augmenté la réponse de grepsedawk.

+0

C'est exactement ce que je cherchais, hacky ou pas (c'est le code de test de l'unité, donc je ne suis pas terriblement inquiet que ce soit privé). Merci! –

1

Au lieu de vérifier chaque constante, pourquoi ne pas faire quelque chose comme:

environment = :TESTING 

if(environment == :TESTING) 
3

Il est peu judicieux d'utiliser trois vrai/faux pour les variables conditions qui sont mutuellement exclusives. Que se passe-t-il, par exemple, si à la fois DÉVELOPPEMENT et PRODUCTION sont définis en même temps.

Au lieu de cela, ont une seule variable qui indique l'environnement que vous êtes, à la mise en ENVIRON l'un des ensembles (DEV, TEST, PROD) ou quelque chose de similaire.

Ensuite, vous pouvez simplement comparer ENVIRON à l'un des trois pour chaque action que vous souhaitez effectuer.

5

Eh bien, je devine parce que cela est étiqueté avec RubyOnRails que nous parlons ici Rails ... l'environnement est stocké dans RAILS_ENV déjà si faire quelque chose comme fonctionne très bien ...

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

I Devinez vous pouvez aussi écrire comme:

RAILS_ENV.include?("development") 
Questions connexes