2013-04-24 4 views
24

Ist es eine gute Übung, Tests für private Methoden zu schreiben?Sollte ich private Methoden mit RSpec testen?

Betrachten Sie das folgende einfache Beispiel:

class Group 
    has_many :members 

    private 

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

Wäre es eine gute Übung einen Test für die release_members Methode in RSpec zu schreiben? Ich glaube, du müsstest den Test schreiben, indem du die Methode mit sendest anrufst. group.send(:release_members), die manchmal verpönt ist.

+1

Es scheint, dass Ruby Rogues einen Podcast von Sandi Metz hat, der über dieses Thema unter http://rubyrogues.com/087-rr-book-clubpractical-object-oriented-design-in-ruby-with-sandi- metz /. Das Argument ist, dass Sie die private Methode testen können, wenn Sie möchten (eventuell sogar den Test löschen), aber am wichtigsten ist die öffentliche Schnittstelle, die die private Methode aufgerufen hat. –

Antwort

17

Eine ausführliche Diskussion dieses Themas finden Sie in diesen Folien aus einem Gespräch von Sandi Metz.

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

Sie sagt, dass Sie Ihre private Methoden Testfahrt können, wenn Sie mögen, aber dass der einzige Test, der Sie sind diejenigen, die Prüfung der öffentlichen Schnittstelle sorgen sollte. Andernfalls könnten Sie zu eng mit der Implementierung verbunden sein.

Ich denke, der Punkt von toch, über das Austeilen von Service- und Wertobjekt und das Unterstellen von Tests ist auch ein gutes, wenn Sie nervös werden über komplexe private Methoden, die nicht getestet werden.

+0

Danke, dass Sie mich auf diesen Link hingewiesen haben. Scheint wie eine große Ressource! –

+1

Die Verbindung ist unterbrochen. – Oin

28

Sie sollten keine privaten Methoden testen, da sie zum internen Mechanismus der Klasse gehören. Der Zweck von Komponententests besteht darin, zu überprüfen, ob sich Ihre Klasse bei der Interaktion mit ihrer Schnittstelle, d. H. Ihren öffentlichen Methoden, wie erwartet verhält.

Wenn Sie an einem bestimmten Punkt nicht mit langen privaten Methoden vertraut sind, liegt es wahrscheinlich daran, dass Sie hier die Möglichkeit haben, diese Logik außerhalb der Klasse zu verwenden und ein anderes Modul oder eine andere Klasse zu erstellen. Dann können Sie es testen, wiederum nur seine Schnittstelle, d.h. seine öffentlichen Methoden.

In einigen seltenen Fällen ist es notwendig, die privaten Methoden zu testen, da die gesamte interne Logik sehr komplex ist und Sie das Problem teilen möchten. Aber in 99,9% ist das Testen privater Methoden eine schlechte Idee.

+0

Macht viel Sinn. Es ist nicht optional, es sollte nicht getestet werden, um die Möglichkeit zu geben, sie frei zu verändern und nur dann zu sorgen, wenn es die externe API bricht. –