2010-11-24 8 views

Respuesta

-2

Si está usando algo como rspec, puede stub Rails.env para devolver un valor diferente para el ejemplo de prueba específica se está ejecutando:

it "should log something in production" do 
    Rails.stub(:env).and_return('production') 
    Rails.logger.should_receive(:warning).with("message") 
    run_your_code 
end 
+0

¿Por qué se bajó este valor? –

+2

Porque solo funciona si realiza comparaciones de cadenas. No se puede usar "de forma nativa", p. ? El siguiente no funciona '' Rails.env.production –

+0

que tenía un tiempo difícil conseguir Rails.stub (: env) para trabajar en los carriles 3.2. No estoy seguro por qué. – fregas

66

usted podría hacer

Rails.stub(env: ActiveSupport::StringInquirer.new("production")) 

Entonces Rails.env, etc Rails.development? funcionará como se espera.

Con RSpec 3 o posterior es posible que desee utilizar la nueva sintaxis "cero monkeypatching" (como se ha mencionado por @AnkitG en otra respuesta) para evitar avisos de obsolescencia:

allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production")) 

por lo general definen un método en stub_env un asistente de especificaciones, así que no tengo que poner todo eso en línea en mis pruebas.

Una opción a considerar (como se sugiere en a comment here) es confiar en una configuración más específica que puede establecer en los archivos de su entorno y cambiar en las pruebas.

+28

¡Gracias a ti mismo! Encontrado esto y estaba a punto de upvote, entonces di cuenta de lo escribí yo mismo hace 6 meses ... –

+1

funcionaba perfectamente, gracias por publicar este truco. –

+0

Buena respuesta aquí. También creo que, en general, es malo tener lugares en tu código repletos de Rails.env o Rails.desarrollo ?, pero esto me ayudó a agregar cobertura de prueba a algún código heredado. – fregas

13

Rspec 3 en adelante se puede hacer

it "should do something specific for production" do 
    allow(Rails).to receive(:env).and_return(ActiveSupport::StringInquirer.new("production")) 
    #other assertions 
end 
+1

gracias por publicar esto, esta es una sintaxis mejor para rspec> = 3 –

+0

Agregué un depurador justo después de esta declaración, pero cuando probaba mis variables de entorno, todavía las obtenía del entorno incorrecto, no el especificado en el declaración. ¿alguna sugerencia? –

+0

@NoamHacker ¿Qué tipo de depurador? ¿Qué le está dando 'Rails.env'? – AnkitG

5

A veces regresaba de una variable de entorno diferente puede ser un dolor de cabeza (variables de entorno de producción requeridos, los mensajes de advertencia, etc.).

Dependiendo de su caso, como una alternativa que puede ser capaz de volver simplemente el valor que necesita para su prueba a pensar que es en otro entorno. Tal como si quisiera rieles a creer que es en la producción de código que comprueba Rails.env.production? se podría hacer algo como esto:

it "does something specific when in production" do 
    allow(Rails.env).to receive(:production?).and_return(true) 
    ##other assertions 
end 

Se podría hacer lo mismo para otros entornos, tales como :development?, :staging?, etc Si usted no necesita la capacidad total de devolver un entorno completo, esta podría ser otra opción.

+0

Agradable y simple - ¡Gracias! – house9

0

Como una variante más simple en varias respuestas anteriores, esto es trabajo para mí:

allow(Rails).to receive(:env).and_return('production') 

O, por lo que estoy haciendo en shared_examples, pase que en una variable:

allow(Rails).to receive(:env).and_return(target_env) 

Sospecho que esto no llega a la solución ...StringInquirer... ya que su aplicación utiliza métodos adicionales para inspeccionar el entorno (por ejemplo, env.production?, pero si el código solo solicita Rails.env, esto es mucho más legible. YMMV.

Cuestiones relacionadas