Mam model z prywatną metodą, którą chciałbym dodać do RSpec,
jak zwykle robisz? Czy testujesz tylko metodę wywołującą połączenie prywatne?
lub określić również prywatny? jeśli tak, jak to zrobić?Jak określić metodę prywatną
Odpowiedz
Zawsze stosuję takie podejście: Chcę przetestować publiczny interfejs API, który udostępnia moja klasa.
Jeśli masz prywatne metody, dzwonisz do nich tylko z publicznych metod, które wystawiasz innym klasom. Jeśli więc przetestujesz, że te publiczne metody działają zgodnie z oczekiwaniami w każdych warunkach, udowodniłeś również, że prywatne metody, z których korzystają, działają również.
Przyznam, że natrafiłem na szczególnie skomplikowane metody prywatne. W skrajnym przypadku, gdy chcesz je przetestować, można to zrobić:
@obj.send(:private_method)
dla metod prywatnych, które wymagają pokrycia kodu (tymczasowo lub na stałe), użyj rspec-context-private gem tymczasowo uczynić metody prywatne publicznego w kontekście.
gem 'rspec-context-private'
Działa poprzez dodanie współdzielonego kontekstu do projektu.
RSpec.shared_context 'private', private: true do
before :all do
described_class.class_eval do
@original_private_instance_methods = private_instance_methods
public *@original_private_instance_methods
end
end
after :all do
described_class.class_eval do
private *@original_private_instance_methods
end
end
end
Następnie, jeśli przejdą :private
jako metadane do describe
bloku, metody prywatne będą publiczne w tym kontekście.
class Example
private def foo
'bar'
end
end
describe Example, :private do
it 'can test private methods' do
expect(subject.foo).not eq 'bar'
end
end
Nie wiem, czy już dłużej utrzymujesz ten klejnot, ale twoja dokumentacja nie ma bloku kodu dotyczącego deklarowania shared_context. Więc nie mogłem go uruchomić po prostu czytając dokumentację. Po dodaniu do tego bloku działa zgodnie z oczekiwaniami. – istrasci
Jeśli chcąc przetestować oczekiwanie na prywatnej metody, zaakceptowane odpowiedź nie będzie naprawdę działa (przynajmniej nie o tym nie wiem, więc jestem otwarty na korekty w tej kwestii). Co zrobiłem zamiast nawet filthier - w samym teście tylko narazić metodę poprzez przekształcenie go:
def object_to_test.my_private_method
super
end
Works na Ruby 1.8, nie mogę wypowiedzieć się na dowolny z nowszych czasach pracy.
- 1. Jak dynamicznie definiować metodę jako prywatną?
- 2. Jak wywołać metodę prywatną spoza klasy java
- 3. Jednostka testująca metodę prywatną - cel C
- 4. Dlaczego chcesz zadeklarować metodę pobierającą i ustawiającą metodę prywatną?
- 5. Jak wywołać prywatną metodę statyczną za pomocą refleksji (Java)?
- 6. Jak mogę sfałszować prywatną metodę statyczną za pomocą PowerMockito?
- 7. Jak wywołać metodę klasy?
- 8. Jak określić, czy obiekt lub odwołanie ma poprawną metodę wymuszania?
- 9. Moq jak określić metodę nazwano z listą zawierającą pewne wartości
- 10. Jak wyśmiać prywatną zmienną dao?
- 11. Myląc „zastąpić prywatną metody”
- 12. Jak zdefiniować metodę pomocnika w moim module Rails?
- 13. Jak definiujesz pakiet-prywatną * cechę * w Scali?
- 14. Jak powiązać ItemsSource z prywatną własnością?
- 15. Jak zrobić niestandardową prywatną wtyczkę w phonegapie
- 16. Jak wyświetlić prywatną aktywność w github?
- 17. Jak utworzyć prywatną funkcję w Swift?
- 18. Dlaczego mogę wywołać metodę prywatną innej instancji tego samego typu poza tą instancją?
- 19. Uzyskaj wyjątek java.lang.NullPointerException, gdy próbowano sfałszować prywatną metodę z mockito i powermockiem
- 20. Jak ustawić prywatną instancję zmienną używaną w teście metody?
- 21. Dokumentowanie prywatną konstruktora z JSDoc
- 22. Jak określić jako typ zwracany metodę typu obiektu, na który wywoływana jest metoda?
- 23. Jak wywołać metodę niejednoznaczną?
- 24. Jak wywołać metodę super?
- 25. jak curry metodę?
- 26. Jak ukryć metodę utylizacji?
- 27. Zainicjuj statyczną prywatną mapę jako pustą
- 28. C# przykład pobieranie GitHub prywatną repo programowo
- 29. TypeScript definiuje własność prywatną podczas implementowania interfejsu
- 30. Zastanawiając prywatną pole z klasy bazowej
Dziękuję za pomoc, zgadzam się, że testowanie publicznej metody dowodzi, że prywatny również działa. Mówiąc o tym, naprawdę chcę przetestować prywatną metodę, a twoje rozwiązanie działa jak czar, dzięki! – Mike
Oto kolejna interesująca metoda: http://kailuowang.blogspot.com/2010/08/testing-private-methods-in-rspec.html – gucki
Mam hook before_save w moim modelu, który zapisuje prywatny token do bazy danych poprzez prywatny Metoda "make_private_token". Metoda 'make_private_token' używa publicznych metod klasy, a nie odwrotnie, więc jedyny sposób, w jaki mogę to przetestować, to metoda 'send'. Nie widzę w tym nic 'ekstremalnego' ... – Starkers