Obecnie staram się nieco kontrolować specyfikacje kontrolera w sposób SUCHO i zwięzły, a na podstawie jednego potwierdzenia. Występują pewne trudności, szczególnie jeśli chodzi o miejsce faktycznego wywołania żądania kontrolera w strukturze zagnieżdżonej, aby dopasować różne przypadki brzegowe.Specyfikacja kontrolera DRY z RSpecem
Oto przykład, uproszczone do wykazania problem:
describe MyController do
let(:item) { Factory(:item) }
subject { response }
describe "GET #show" do
before(:each) do
get :show
end
context "published item" do
it { should redirect_to(success_url) }
end
context "unpublished item" do
before(:each) do
item.update_attribute(published: false)
end
it { should redirect_to(error_url) }
end
end
end
Oczywiste jest to wymyślony przykład, ale pokazuje, co chciałbym zrobić, a co nie działa. Głównie problemem jest blok before
w kontekście "niepublikowanym". Co się dzieje, to że zmiana, którą wprowadziłem w danych konfiguracyjnych, rzeczywiście się zdarza po wywołaniu wywołania get
ze względu na sposób zagnieżdżenia kontekstów, więc przykład w tym kontekście faktycznie działa ze scenariuszem początkowym, a nie tym, który zamierzam.
Rozumiem, dlaczego tak się dzieje i jak zagnieżdżają się konteksty. Chyba co ja jak mieć jakiś sposób powiedzieć rspec co chciałbym go uruchomić prawy po dowolny before
haki jeszcze prawo przed żadnych twierdzeń w danym kontekście. Byłoby to idealne dla specyfikacji kontrolera. Chciałbym skorzystać z zagnieżdżania w specyfikacji kontrolera, aby stopniowo zwiększać wariacje przypadków krawędziowych bez konieczności rozpraszania połączenia get
, a nawet wywoływania pomocnika do_get
w każdym z moich asercji it
. Szczególnie denerwuje to zachowanie synchronizacji z dowolnymi niestandardowymi makrami, których używam.
Czy jest coś w RSpec, aby to osiągnąć? Czy są jakieś sztuczki, których mogę użyć, aby się zbliżyć? Wydawałoby się idealnie pasować do sposobu, w jaki widziałem wiele osób piszących specyfikacje kontrolerów; z tego, co odkryłem, ludzie w zasadzie ustalili, że przed każdym asercją są wywoływani pomocnicy do_get
. Czy istnieje lepszy sposób?
Dobra uwaga. Dodatkowa gadatliwość może być warta zachowania jasności specyfikacji, nawet jeśli wywołanie "get" nadal się powtarza. Mimo to wydaje się, że specyfikacje kontrolera, które mają specyficzny przypadek użycia odpowiedzi na działanie REST, mogłyby w jakiś sposób ograniczyć takie powtórzenia. –
Chris - Zgadzam się, że jakiś skrót byłby przyjemny i jestem otwarty na ten pomysł, ale widzę, że ten, który utrzymuje to, co uważam za odpowiedni poziom jasności. Jeśli masz jakieś pomysły, proszę przesłać zapytanie o funkcję na https://github.com/rspec/rspec-rails/issues. –