Biorąc pod uwagę, że mam Personable
problem z moją aplikacją Rails 4, która ma full_name
metodę, jak bym to przetestował używając RSpec?
dotyczy / personable.rb
module Personable
extend ActiveSupport::Concern
def full_name
"#{first_name} #{last_name}"
end
end
ruby-on-rails
testing
rspec
Kyle Decot
źródło
źródło
ActiveSupport::Concern
został wyjęty z Railsów? Myślałem, że to minęło chwilę temu.Odpowiedzi:
Metoda, którą znalazłeś, z pewnością zadziała, aby przetestować trochę funkcjonalności, ale wydaje się dość krucha - twoja fikcyjna klasa (właściwie tylko
Struct
w twoim rozwiązaniu) może zachowywać się jak prawdziwa klasa, ale nie musiinclude
. Dodatkowo, jeśli próbujesz przetestować obawy dotyczące modelu, nie będziesz mógł wykonywać takich czynności, jak testowanie poprawności obiektów lub wywoływanie wywołań zwrotnych ActiveRecord, chyba że odpowiednio skonfigurujesz bazę danych (ponieważ twoja fikcyjna klasa nie będzie miała kopii zapasowej tabeli bazy danych to). Co więcej, będziesz chciał nie tylko przetestować problem, ale także przetestować jego zachowanie w specyfikacji modelu.Dlaczego więc nie upiec dwóch pieczeni na jednym ogniu? Używając wspólnych przykładowych grup RSpec , możesz sprawdzić swoje obawy w odniesieniu do klas, które ich używają (np. Modeli) i przetestować je wszędzie tam, gdzie są używane. I wystarczy tylko raz napisać testy, a następnie po prostu uwzględnić je w specyfikacji dowolnego modelu, która wykorzystuje Twoje obawy. W twoim przypadku może to wyglądać mniej więcej tak:
Zalety tego podejścia stają się jeszcze bardziej oczywiste, gdy zaczynasz robić rzeczy w swoim problemie, takie jak wywoływanie wywołań zwrotnych AR, gdzie nic mniej niż obiekt AR po prostu nie zadziała.
źródło
parallel_tests
. Myślę, że lepiej będzie mieć osobne testy zamiast używaćshared_examples_for
iit_behaves_like
.parallel_tests
są oparte na plikach, więc udostępnione przykłady nie powinny spowalniać. Twierdziłbym również, że odpowiednio pogrupowane wspólne zachowania mają przewagę nad szybkością testowania.concerns
katalog w swoimspec_helper.rb
github.com/rspec/rspec-core/issues/407#issuecomment-1409871_spec
do nazwy pliku, która zawiera shared_examples_for (w tym przypadku personable_spec.rb), w przeciwnym razie otrzymasz mylące ostrzeżenie - github.com/rspec/rspec-core/issues/828 .W odpowiedzi na otrzymane komentarze, oto co ostatecznie zrobiłem (jeśli ktoś ma ulepszenia, prosimy o ich opublikowanie) :
spec / problems / personable_spec.rb
źródło
Person
. Zmienię, żeby naprawić.undefined method 'full_name' for #<struct first_name="Stewart", last_name="Home">
Innym pomysłem jest użycie klejnotu with_model do testowania takich rzeczy. Chciałem sam przetestować problem i widziałem, jak robi to klejnot pg_search . Wydaje się to o wiele lepsze niż testowanie na poszczególnych modelach, ponieważ mogą się one zmienić i fajnie jest zdefiniować rzeczy, których będziesz potrzebować w swojej specyfikacji.
źródło