2013-07-13 13 views
6

Mam moduł, który może być skonfigurowany tak:Jak załadować moduły między testami RSpec a Ruby?

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

MyModule.setting = :custom_value 

Ja testując różne opcje konfiguracyjne z RSpec i stwierdzili, że ustawienia utrzymują się między różnymi testami, ponieważ są one zmienne klasy.

Jaki jest najlepszy sposób na ponowne załadowanie i ponowne zainicjowanie modułu pomiędzy testami RSpec?

+1

Pokaż swój kod testowy. Jak ładujesz, jak testujesz? – vgoff

+0

cześć, mam ten sam problem .. Czy znalazłeś jakieś czyste rozwiązanie? – masciugo

+0

Czy kiedykolwiek to wymyśliłeś? Mam atrybut, który chcę tylko dostępny na maszynach testowych, więc mam testy, które pozwalają (Rails.env), na otrzymywanie (: produkcji?) .. ale po pierwszym uruchomieniu testu, przenika wszystkie pozostałe. Same są w porządku. – baash05

Odpowiedz

0

1: Czy próbowałeś wymagać pliku w bloku before :each?

require 'my_module' 

2: Nie wiem, czy należy ponownie załadować plik. Z tego, co wydaje się, że wszystko, co chcesz, to wartości niektórych klas, aby znów stać się domyślnymi, dlatego właśnie utworzyłem metodę, która zmienia wartości modułu na dowolne życzenie.

describe MyModule do 

    def module_to_default 
    MyModule.setting = :some_default_value 
    end 

    before :each do 
    module_to_default 
    end 
end 

Jeśli widzisz dobrego wykorzystania na zalegających tej wartości modułu w kodzie może to być nawet dobry pomysł, aby przenieść metodę do samego modułu.

+0

Rozwiązanie 1 niczego nie zmienia - plik był już załadowany i zdefiniowane stałe, nie przeładowuje. Rozwiązanie 2 zadziała, ale potrzebuje tej metody to_default, która będzie używana tylko w testach. Chciałbym trzymać się z dala od tego. –

2

doszedłem do tego rozwiązania:

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 

Źródło: http://geminstallthat.wordpress.com/2008/08/11/reloading-classes-in-rspec/

Powiązane problemy