Rozszerzam istniejącą bibliotekę, tworząc klasę potomną, która rozciąga się do klasy biblioteki.Jak mogę kpić super w rubinach za pomocą rspec?
W klasie podrzędnej mogłem przetestować większość funkcji w metodzie initialize
, ale nie mogłem wyśmiać połączenia super
. Klasa dziecka wygląda jak coś poniżej.
class Child < SomeLibrary
def initialize(arg)
validate_arg(arg)
do_something
super(arg)
end
def validate_arg(arg)
# do the validation
end
def do_something
@setup = true
end
end
Jak mogę napisać rspec testu (z mocha) taką, że mogę Mock super
połączenie? Zauważ, że testuję funkcjonalność metody initialize
w klasie Child
. Czy muszę utworzyć oddzielną ścieżkę kodu, która nie wywołuje super
, gdy jest dostarczana z dodatkowym argumentem?
Czy to znaczy, że nie może pisać RSpec test zainicjować? Czy pisanie testów jednostkowych dla metody inicjalizacji jest złą praktyką? Nawiasem mówiąc, rozbudowuję bibliotekę konektorów baz danych. Jeśli nie piszę testu jednostkowego, ale piszę test integracji, po prostu myślę, że to dziwne, jeśli test rspec wymaga połączenia z prawdziwą bazą danych. –
Nie ma dla mnie sensu, dlaczego nie możemy kpić super. Wydaje się to przydatne, aby odpowiednio przetestować zachowanie inicjacyjne w izolacji, a na pewno super jest wiadomością wysłaną do instancji klasy, nie? –
Nie, 'super' to _nie_ wiadomość wysłana do instancji klasy. Nie mam żadnych rubinowych metaprogramujących konstrukcji, które by to umożliwiały, a nawet gdyby tak było, nadal nie jestem przekonany, że to dobry pomysł. –