2012-12-28 16 views
6

Testuję zmienną instancji poziomu klasy (i seterów) w klejnocie za pomocą protokołu RSpec. Muszę przetestować następujące:Testowanie zmiennych klasy RSpec

  1. Prawidłowa wartość domyślna jest podawana, jeśli ustawnik nigdy nie jest używany.
  2. Zmienna może być pomyślnie zaktualizowana przez setery.

Oczywiście istnieje tutaj kwestia kolejności uruchamiania. Jeśli zmienię wartości za pomocą ustawiaczy, tracę pamięć o wartości domyślnej. Mogę zapisać go do zmiennej przed testem ustawiającym, a następnie zresetować wartość na końcu, ale to tylko chroni mnie, jeśli wszystkie testy ustawiające podążają tą samą praktyką.

Jaki jest najlepszy sposób przetestowania wartości domyślnej zmiennej?

Oto prosty przykład:

class Foo 
    class << self 
    attr_accessor :items 
    end 
    @items = %w(foo bar baz) # Set the default 
    ... 
end 

describe Foo do 

    it "should have a default" do 
    Foo.items.should eq(%w(foo bar baz)) 
    end 

    it "should allow items to be added" do 
    Foo.items << "kittens" 
    Foo.items.include?("kittens").should eq(true) 
    end 
end 
+0

ohh, więc masz na myśli coś w rodzaju 'Foo.bar = 1'? –

+0

Tak, kod jest aktualizowany na przykład. –

Odpowiedz

8
class Foo 

    DEFAULT_ITEMS = %w(foo bar baz) 
    class << self 
    attr_accessor :items 
    end 
    @items = DEFAULT_ITEMS 

end 

describe Foo do 
    before(:each) { Foo.class_variable_set :@items, Foo::DFAULT_ITEMS } 

    it "should have a default" do 
    Foo.items.should eq(Foo::DEFAULT_ITEMS) 
    end 

    it "should allow items to be added" do 
    Foo.items << "kittens" 
    Foo.items.include?("kittens").should eq(true) 
    end 
end 

A może lepszym sposobem jest przeładowanie klasa

describe 'items' do 
    before(:each) do 
    Object.send(:remove_const, 'Foo') 
    load 'foo.rb' 
    end 

end 
+0

To jest @zmienna na poziomie klasy. Jeśli użyję 'before (: each)', wartość domyślna może zostać zmieniona w kodzie, a testy nie zauważą. –

+0

edytował moją odpowiedź –

+0

Dobre rozwiązanie. Byłem wizjonerem tunelu, aby wykonać test kodu, zamiast sprawić, by mój kod był bardziej testowalny. Dziękuję za odejście z powrotem na ścieżkę! :) –

6

Jeśli klasa ma wewnętrzne stany, które chcesz przetestować I Przekonaj się, że używanie class_variable_get to dobry sposób na zbliżenie się do tego. Nie wymaga to ujawniania żadnej z zmiennych w klasie, więc klasa może pozostać nietknięta.

wiem, nie jest to, o co prosisz w swoim pytaniu, ale jest w tytule, który dostał mnie tutaj.

+0

Dzięki za dodanie. Masz rację, że jest trochę inaczej, ale mam nadzieję, że pomoże to innym, którzy znajdą ten post i szukają czegoś innego niż to, co rozwiązałem. –

+0

Dokładnie tego, czego szukałem: D dzięki – gdurelle

Powiązane problemy