Mam kontroler:
class AccountController < ApplicationController
def index
end
private
def current_account
@current_account ||= current_user.account
end
end
Jak przetestować metodę prywatną current_account
z rspec?
PS Używam Rspec2 i Ruby on Rails 3
ruby-on-rails
rspec
petRUShka
źródło
źródło
Odpowiedzi:
Użyj #instance_eval
źródło
Używam metody wysyłania. Na przykład:
Ponieważ „wyślij” może wywoływać metody prywatne
źródło
.send
?Gdzie jest używana metoda current_account? Do czego to służy?
Ogólnie rzecz biorąc, nie testujesz metod prywatnych, ale raczej testujesz metody, które wywołują metodę prywatną.
źródło
Należy nie testować metod prywatnych bezpośrednio, mogą i powinny być testowane pośrednio poprzez wykonywanie kodu z metod publicznych.
Pozwala to na zmianę elementów wewnętrznych kodu w przyszłości bez konieczności zmiany testów.
źródło
Możesz uczynić swoje prywatne lub chronione metody jako publiczne:
Po prostu umieść ten kod w swojej klasie testowej, zastępując nazwę swojej klasy. W razie potrzeby uwzględnij przestrzeń nazw.
źródło
źródło
Prywatne metody testów jednostkowych wydają się zbyt wyrwane z kontekstu zachowania aplikacji.
Czy najpierw piszesz kod telefoniczny? Ten kod nie jest wywoływany w Twoim przykładzie.
Zachowanie jest następujące: chcesz, aby obiekt został załadowany z innego obiektu.
Dlaczego chcesz napisać test wyrwany z kontekstu zachowania, które powinieneś próbować opisać?
Czy ten kod jest używany w wielu miejscach? Potrzebujesz bardziej ogólnego podejścia?
https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/controller-specs/anonymous-controller
źródło
Użyj klejnotu rspec-context-private, aby tymczasowo upublicznić metody prywatne w kontekście.
Działa poprzez dodanie współdzielonego kontekstu do twojego projektu.
Następnie, jeśli przekażesz
:private
jako metadane dodescribe
bloku, metody prywatne będą publiczne w tym kontekście.źródło
Jeśli chcesz przetestować funkcję prywatną, utwórz metodę publiczną, która wywoła funkcję prywatną.
źródło
Wiem, że to trochę hacky, ale działa, jeśli chcesz, aby metody były testowane przez rspec, ale nie były widoczne w prod.
Teraz, kiedy możesz biegać, masz taką specyfikację:
źródło