2013-02-20 7 views
7

Ich versuche, eine Klasse mit RSpec2 zu testen, die einige private Methoden hat, die von einigen öffentlichen Methoden aufgerufen werden. Ich teste die öffentlichen Methoden mitRSpec: Stub private Methode

, wenn sie aufgerufen werden und wie oft. Mein Problem ist, dass dieser Ansatz nicht mit privaten Methoden funktioniert. Also, gibt es eine Möglichkeit, etw zu verwenden wie @foo.send(:private_method) in Kombination mit should_receive? Oder irgendeine andere Syntax?

Antwort

10

should_receive (: Methode) funktioniert, ob: Methode ist öffentlich oder privat ...

+1

eehmm ... Ich bin mir sicher, dass es funktioniert. Kannst du es mehr erklären, was du meinst? – 23tux

+0

Ich habe es ausprobiert, wenn ich versuche, mit einer privaten Methode sent_receive aufzurufen, bekomme ich 'private Methode' start_training 'aufgerufen für # ' – 23tux

+0

Könnten Sie ein bisschen mehr Code posten? In der Spezifikation arbeite ich an atm, ich sollte private Methoden ohne Probleme ... –

0

Warum möchten Sie die privaten Methoden testen? Sie sind aus einem Grund privat; um den Zugriff von externen Anrufen zu verhindern. Das Testen der öffentlichen Methoden, die auf den privaten Methoden beruhen, sollte ausreichend sein.

+6

Ich bin mir ziemlich sicher, dass es sich lohnt, private Methoden zu testen. Andernfalls, wenn Sie 10 öffentliche Methoden haben, die auf dieser einen privaten Methode beruhen, könnten Sie am Ende immer wieder das Verhalten aller öffentlichen Methoden testen. –

+1

@ AndréHerculano ja, aber Sie sollten Verhalten testen, nicht die Umsetzung. Sie würden die Rückgabe dieser öffentlichen Methoden unabhängig von den verwendeten privaten Methoden testen. –

5

Sie allow_any_instance_of Methode verwenden, kann jede Instanz einer Klasse für beispielsweise Stummel oder verspotten Sie haben ein classFoo mit einigen private Methoden genannt, als Sie so etwas wie dieses

allow_any_instance_of(Foo).to receive(:private_method) do 
    #do something 
end 

tun können, falls es, wenn Sie module auch haben, können Sie so etwas wie dieses

allow_any_instance_of(Module::Foo).to receive(:private_method) do 
    #do something 
end 

Sie mehr tun können, finden Details über allow_any_instance_of() Methode bei Official Documentation