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
should_receive (: metoda) działa czy: metoda jest publiczna czy prywatna ...
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ć.
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. –
@ 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ą. –
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
eehmm ... Jestem pewien, że to działa. Czy możesz wyjaśnić więcej, co masz na myśli? – 23tux
Próbowałem go, kiedy próbuję wywołać should_receive z prywatną metodę, otrzymuję 'private method' start_training 'wywoływane # # Run: 0x007f7f7e2ebe68> ' – 23tux
Czy mógłbyś dodać nieco więcej kodu? W specyfikacji pracuję nad atmem, powinienem dostać prywatne metody bez problemów ... –