2011-01-18 11 views
5

Mam klasy wiadomości, które można zainicjować, przekazując argumenty do konstruktora lub przekazując żadnych argumentów, a następnie ustawiając atrybuty później za pomocą akcesorów. Istnieje pewne przetwarzanie wstępne w metodach ustawiających atrybuty.Jak mogę potwierdzić podczas inicjowania zachowania z RSpec?

Mam testy, które zapewniają, że metody ustawiacza robią to, co powinny, ale nie potrafię wymyślić dobrego sposobu na sprawdzenie, czy metoda inicjowania faktycznie wywołuje ustawienia.

class Message 
    attr_accessor :body 
    attr_accessor :recipients 
    attr_accessor :options 

    def initialize(message=nil, recipients=nil, options=nil) 
    self.body = message if message 
    self.recipients = recipients if recipients 
    self.options = options if options 
    end 

    def body=(body) 
    @body = body.strip_html 
    end 
    def recipients=(recipients) 
    @recipients = [] 
    [*recipients].each do |recipient| 
     self.add_recipient(recipient) 
    end 
    end 
end 
+0

Możliwe wytyczne tutaj: http://stackoverflow.com/questions/316294/rspec-how-to-stub-an-instance-method-called-by-constructor –

Odpowiedz

4

bym raczej przetestować zachowanie inicjatora,

to znaczy, że jego konfiguracja zmienne, jak można by oczekiwać.

Nie dać się złapać w rzeczywistość, w jaki sposób to robisz, założyć, że podstawowe narzędzia działają, lub alternatywnie możesz ustawić zmienne instancji, jeśli chcesz. To prawie dobry stary test jednostkowy.

np.

describe "initialize" do 
    let(:body) { "some text" } 
    let(:people) { ["Mr Bob","Mr Man"] } 
    let(:my_options) { { :opts => "are here" } } 

    subject { Message.new body, people, my_options } 

    its(:message) { should == body } 
    its(:recipients) { should == people } 
    its(:options) { should == my_options } 
end 
+0

myślę, być może mój przykładowy kod ISN” t obraz tego, co chcę zrobić, opiszę lepiej, aby wyjaśnić - chodzi o to, że metody setera nie przechowują tylko wartości. Chcę mieć testy, które testują wszystkie skrajne przypadki metod ustawiających, a następnie test, który mówi mi, że inicjator używa ich, więc nie muszę duplikować przypadków testowych. – Glenjamin

+0

Naprawdę, co twoje testowanie jest metodą prywatną. Powinieneś tylko zadawać sobie pytanie: "co się dzieje, gdy tworzę wiadomość z tymi argumentami", w przeciwieństwie do "co jest inicjowane w wiadomościach". W ten sposób twoja implementacja jest otwarta na zmiany, podczas gdy testy mogą pozostać takie same. –

Powiązane problemy