2013-04-24 19 views
24

Czy dobrą praktyką jest pisanie testów dla prywatnych metod?Czy należy testować prywatne metody przy użyciu protokołu RSpec?

Rozważmy następujący prosty przykład:

class Group 
    has_many :members 

    private 

    def release_members 
    members.each { |member| member.update_attributes group_id: nil } 
    end 
end 

byłoby to dobra praktyka, aby napisać test dla metody release_members w RSpec? Sądzę, że musiałbyś napisać test wywołujący metodę z wysyłką tj. group.send(:release_members), który czasami jest mile zaskoczony.

+1

Wygląda na to, że ruby ​​rogues ma podcast autorstwa Sandi Metz, który mówi o tym temacie na http://rubyrogues.com/087-rr-book-clubpractical-object-oriented-design-in-ruby- with-sandi- metz /. Argumentem jest to, że możesz przetestować metodę prywatną, jeśli chcesz (ewentualnie nawet usunąć test), ale najważniejszy jest interfejs publiczny, który wywołał metodę prywatną. –

Odpowiedz

17

Możesz znaleźć szczegółową dyskusję na ten temat w tych slajdach z wykładu Sandi Metz.

https://speakerdeck.com/skmetz/magic-tricks-of-testing-railsconf

Mówi, że może Przetestuj swoje metody prywatne, jeśli chcesz, ale to jedyny test, który należy martwić się o to te testowanie interfejsu publicznego. W przeciwnym razie możesz się zbytnio związać z implementacją.

Sądzę, że punkt widzenia, dzielenia usługi i wartości przedmiotu oraz poddawania testowanych osób również jest dobry, jeśli denerwujesz się złożonymi prywatnymi metodami, które nie są testowane.

+0

Dzięki za wskazanie mi tego linku. Wydaje się, że jesteś wspaniałym źródłem! –

+1

Link jest uszkodzony. – Oin

28

Nie należy testować metod prywatnych, ponieważ należą one do wewnętrznego mechanizmu klasy. Celem testów jednostkowych jest sprawdzenie, czy twoja klasa zachowuje się zgodnie z oczekiwaniami podczas interakcji z jej interfejsem, tj. Z publicznymi metodami.

Jeśli w pewnym momencie nie czujesz się komfortowo z długimi prywatnymi metodami, to prawdopodobnie dlatego, że masz tutaj możliwość wyciągnięcia tej logiki poza klasę i zbudowania innego modułu lub klasy. Następnie możesz przetestować urządzenie, ponownie tylko jego interfejs, tj. Jego publiczne metody.

W niektórych rzadkich przypadkach konieczne jest przetestowanie prywatnych metod, ponieważ cała wewnętrzna logika jest bardzo złożona i chciałbyś podzielić problem. Ale w 99,9% testowanie prywatnych metod to zły pomysł.

+0

Ma wiele sensu. To nie jest opcjonalne, nie powinno się go testować, aby dać mu możliwość swobodnego modyfikowania i martwić się tylko wtedy, gdy złamie zewnętrzny interfejs API. –

Powiązane problemy