2013-07-13 10 views
6

Ho un modulo che può essere configurato in questo modo:Come ricaricare i moduli tra i test RSpec con Ruby?

module MyModule 
    mattr_accessor :setting 
    @@setting = :some_default_value 
end 

MyModule.setting = :custom_value 

sto testando diverse opzioni di configurazione con RSpec, e ha scoperto che le impostazioni persistono tra i diversi test perché sono variabili di classe.

Qual è il modo migliore di ricaricare e inizializzare nuovamente il modulo tra i test di RSpec?

+1

Mostra il tuo codice di prova. Come stai caricando, come stai testando? – vgoff

+0

ciao, ho lo stesso problema .. Hai trovato qualche soluzione pulita? – masciugo

+0

lo hai mai capito? Ho un attributo che voglio solo disponibile su macchine di prova, quindi ho test che consentono (Rails.env), di ricevere (: produzione?) .. ma una volta che il primo test viene eseguito, mette a disagio tutti gli altri. Da soli stanno bene. – baash05

risposta

0

1: Hai provato a richiedere il file in un blocco before :each?

require 'my_module' 

2: Non so se ricaricare un file sia la cosa giusta da fare qui. Da quello che sembra tutto ciò che vuoi è che i valori di una classe diventino di default, per cui creo un metodo che modifichi i valori del modulo in base a ciò che desidero.

describe MyModule do 

    def module_to_default 
    MyModule.setting = :some_default_value 
    end 

    before :each do 
    module_to_default 
    end 
end 

Se si vede un buon uso per inadempiente questi valori di modulo nel codice può anche essere una buona idea per spostare il metodo nel modulo stesso.

+0

Soluzione 1 non modifica nulla: il file è già stato caricato e le costanti sono state definite, non viene ricaricato. La soluzione 2 funzionerebbe, ma poi ha bisogno di questo metodo to_default che verrebbe utilizzato solo nei test. Mi piacerebbe stare lontano da quello. –

2

Sono venuto a questa soluzione:

describe MyModule do 

    before :each do 
    # Removes the MyModule from object-space (the condition might not be needed): 
    Object.send(:remove_const, :MyModule) if Module.const_defined?(:MyModule) 

    # Reloads the module (require might also work): 
    load 'path/to/my_module.rb' 
    end 

    it "should have X value" do 
    MyModule.setting = :X 

    expect(MyModule.setting).to eq :X 
    end 

end 

Fonte: http://geminstallthat.wordpress.com/2008/08/11/reloading-classes-in-rspec/

Problemi correlati