2011-11-25 15 views
15

Tengo la siguiente clase: Quiero asegurarme de que la url de clase solo se establezca una vez para todas las instancias.¿Cómo puedo borrar las variables de clase entre las pruebas rspec en ruby?

class DataFactory 
    @@url = nil 

    def initialize() 
begin 
    if @@url.nil? 
     Rails.logger.debug "Setting url" 
     @@url = MY_CONFIG["my value"] 
    end 
rescue Exception 
    raise DataFactoryError, "Error!" 
end 
    end 
end 

tengo dos pruebas:

it "should log a message" do 
    APP_CONFIG = {"my value" => "test"} 
    Rails.stub(:logger).and_return(logger_mock) 
    logger_mock.should_receive(:debug).with "Setting url" 

    t = DataFactory.new 
    t = nil 
end 

it "should throw an exception" do 
    APP_CONFIG = nil 

    expect { 
    DataFactory.new 
    }.to raise_error(DataFactoryError, /Error!/) 
end 

El problema es la segunda prueba nunca se produce una excepción como la variable @@ clase URL aún se establece a partir de la primera prueba cuando el segundo pruebas de funcionamiento. Aunque tengo la instancia de nulo al final de la primera prueba, la recolección de basura no ha borrado la memoria antes de que se ejecute la segunda prueba:

¡Cualquier idea sería genial! Escuché que posiblemente podría utilizar Class.new, pero no estoy seguro de cómo hacerlo.

+0

relacionado con su problema, pero: * nunca * use las variables @@ class en Ruby. Use las variables de instancia de @class en su lugar. Se comportan mucho más predeciblemente. –

Respuesta

19
describe DataFactory 
    before(:each) { DataFactory.class_variable_set :@@url, nil } 
    ... 
end 
+1

Cuando me encontré con este me dieron el siguiente error: ** NameError: url variable de clase sin inicializar @@ en Objeto ** lo tengo para trabajar usando: ' antes (: cada uno) hacer DataFactory.class_eval {class_variable_set: @@ url, nil} final' _Estoy utilizando JRuby 1.6.5 que creo que usa Ruby 1.8.9 y class_variable_set puede ser privado en esta versión, así que tuve que usar class_eval_ Ver: [http: //www.khelll .com/blog/ruby ​​/ ruby-reflection-2 /] –

3

Aquí es una alternativa a la respuesta aceptada, que si bien no resolvería el ejemplo particular, estoy esperando que podría ayudar a algunas personas con una pregunta en el mismo sentido. Si la clase en cuestión no especifica un valor por defecto, y permanece indefinido hasta que cuaje, esto parece funcionar:

describe DataFactory 
    before(:each) do 
    DataFactory.remove_class_variable :@@url if DataFactory.class_variable_defined? :@@url 
    end 
    ... 
end 

Obras para mí con una clase con algo más como:

def initialize 
    @@url ||= MY_CONFIG["my value"] 
    ... 
end 
No es exactamente
Cuestiones relacionadas