2013-02-20 15 views
7

Próbuję przetestować klasę z RSpec2, który ma niektóre prywatne metody, które są wywoływane z niektórych publicznych metod. Testuję publiczne metody z użyciem, jeśli są one wywoływane i jak często. Mój problem polega na tym, że takie podejście nie działa z prywatnymi metodami. Czy istnieje jakiś sposób użycia czegoś takiego jak @foo.send(:private_method) w połączeniu z should_receive? Lub jakiejkolwiek innej składni?RSpec: Metoda prywatna Stub

Odpowiedz

10

should_receive (: metoda) działa czy: metoda jest publiczna czy prywatna ...

+1

eehmm ... Jestem pewien, że to działa. Czy możesz wyjaśnić więcej, co masz na myśli? – 23tux

+0

Próbowałem go, kiedy próbuję wywołać should_receive z prywatną metodę, otrzymuję 'private method' start_training 'wywoływane # # Run: 0x007f7f7e2ebe68> ' – 23tux

+0

Czy mógłbyś dodać nieco więcej kodu? W specyfikacji pracuję nad atmem, powinienem dostać prywatne metody bez problemów ... –

0

Dlaczego chcesz przetestować prywatne metody? Są prywatne z jakiegoś powodu; aby uniemożliwić dostęp z połączeń zewnętrznych. Testowanie publicznych metod, które opierają się na prywatnych metodach, powinno wystarczyć.

+6

Jestem prawie pewien, że warto przetestować prywatne metody. W przeciwnym razie, jeśli masz 10 publicznych metod, które opierają się na tej jednej prywatnej metodzie, możesz w końcu powtórzyć testowanie zachowania wszystkich publicznych tych metod. –

+1

@ AndréHerculano tak, ale powinieneś testować zachowanie, a nie implementację. Testowałbyś zwroty tych publicznych metod, niezależnie od tego, jakie prywatne metody używają. –

5

Można użyć allow_any_instance_of metodę skrótową lub wyśmiewać dowolną instancję klasy na przykład masz class nazwie Foo z niektórych private metodami niż można zrobić coś takiego

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

W przypadku, gdy nie masz module też można zrobić coś takiego

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

można znaleźć więcej szczegóły na temat metody allow_any_instance_of() pod adresem Official Documentation