2008-12-03 23 views
5

En ruby, ¿hay alguna manera de "indefinir" una variable o constante una vez que se ha definido?¿Es posible definir una variable en rubí?

En nuestros environemnts carriles, definimos una de las tres contants para ser true, dependiendo del entorno: TESTING, DEVELOPMENT o PRODUCTION. Luego, en el código del controlador, usamos defined? para ver si en qué entorno estamos, es decir: defined? PRODUCTION.

Ahora, quiero probar unitario parte de ese comportamiento específico del entorno. Mi primer intento fue simplemente establecer la constante adecuada en mi prueba, y luego reiniciarlos en el desmontaje. Sin embargo, no puedo encontrar la forma de restablecer DEVELOPMENT y PRODUCTION de modo que defined? devuelva falso.

Obviamente, una solución sería simplemente comprobar si la constante adecuada también es cierta además de verificar si está definida, pero esto tendrá que tocar una cantidad considerable de código existente.

EDIT: me doy cuenta de que definitivamente esta NO es la manera correcta de hacer las cosas. Por desgracia, cambiarlo no es una tarea trivial, así que estoy buscando una forma sencilla de probar lo que hay ahora. Además, también me interesa la cuestión del lenguaje de nivel inferior sobre si es posible definir una variable/constante.

Respuesta

8

encontré this answer

Object.send(:remove_const, "TESTING") 

Si mal no recuerdo, usar send aquí es una especie de truco, porque remove_const es realmente un método privado. Desea preguntarse por qué necesita definir constantes PRODUCCIÓN, DESARROLLO y PRUEBAS al mismo tiempo, mientras que realmente son mutuamente excluyentes; por eso subí la respuesta de grepsedawk.

+0

Esto es exactamente lo que estaba buscando, hacky o no (es el código de prueba de unidad, por lo que no estoy terriblemente preocupado de que sea privado). ¡Gracias! –

1

En lugar de comprobar cada constante, por qué no hacer algo como:

environment = :TESTING 

if(environment == :TESTING) 
3

No tiene mucho sentido utilizar tres variables verdadero/falso para las condiciones que se excluyen mutuamente. Qué sucede, por ejemplo, si tanto DEVELOPMENT como PRODUCTION se establecen al mismo tiempo.

En su lugar, tienen una única variable que indica qué entorno que se encuentre, el establecimiento de ENVIRON a uno de los conjuntos (DEV, TEST, PROD) o algo similar.

Luego puede comparar ENVIRON con uno de los tres para cada acción que desea realizar.

5

Bueno, yo supongo, porque esto se etiqueta con RubyOnRails que estamos hablando aquí ... Rieles el medio ambiente se almacena en RAILS_ENV ya tan hacer algo como funciona bien ...

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

I supongo que también se puede escribir como:

RAILS_ENV.include?("development") 
Cuestiones relacionadas