2013-02-20 23 views
7

Provo a testare una classe con RSpec2, che ha alcuni metodi privati, che vengono chiamati da alcuni metodi pubblici. Ho provato i metodi pubblici conRSpec: metodo privato Stub

@foo.should_receive(:start_training).exactly(2).times 

se vengono chiamati e con quale frequenza. Il mio problema è che questo approccio non funziona con metodi privati. Quindi, c'è un modo per usare sth come @foo.send(:private_method) in combinazione con should_receive? O qualsiasi altra sintassi?

risposta

10

should_receive (: metodo) funziona se: metodo è pubblico o privato ...

+1

eehmm ... Sono sicuro che funzioni. Puoi spiegarlo di più di cosa intendi? – 23tux

+0

L'ho provato, quando provo a chiamare should_receive con un metodo privato, ottengo 'metodo privato' start_training 'chiamato per # ' – 23tux

+0

Potresti postare un po' più di codice? Nello specifico sto lavorando su atm, dovrei_recezionare metodi privati ​​senza problemi ... –

0

Perché vuoi testare i metodi privati? Sono privati ​​per una ragione; per impedire l'accesso da chiamate esterne. Testare i metodi pubblici che si basano sui metodi privati ​​dovrebbe essere sufficiente.

+6

Sono abbastanza sicuro che valga la pena testare metodi privati. Altrimenti, se hai 10 metodi pubblici che si basano su quel metodo privato, potresti finire per ripetere te stesso testando il comportamento di tutti quei metodi pubblici. –

+1

@ AndréHerculano sì, ma dovresti testare il comportamento, non l'implementazione. Dovresti testare i ritorni di quei metodi pubblici, indipendentemente da quali metodi privati ​​usano. –

5

È possibile utilizzare allow_any_instance_of metodo per stub o deridere qualsiasi istanza di una classe per esempio si dispone di un class nome Foo con alcuni private metodi di quanto si può fare qualcosa di simile

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

Nel caso in cui il gioco è fatto module inoltre, è possibile fare qualcosa di simile

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

È possibile trovare maggiori dettagli sul metodo allow_any_instance_of() allo Official Documentation