RSpec: Jaka jest różnica między funkcją a specyfikacją żądania?

113

Jaka jest koncepcyjna różnica między specyfikacjami funkcji Rspec a specyfikacjami żądań ?

Z dokumentacji specyfikacji funkcji:

Specyfikacje funkcji to testy wysokiego poziomu, których celem jest sprawdzenie fragmentów funkcjonalności za pośrednictwem aplikacji. Powinny sterować aplikacją tylko przez jej interfejs zewnętrzny, zwykle strony internetowe.

A dla specyfikacji żądania:

Specyfikacje żądań zapewniają cienkie opakowanie wokół testów integracji Railsów i są zaprojektowane tak, aby kierować zachowaniem przez cały stos, w tym routing (dostarczany przez Rails) i bez kodowania (to zależy od Ciebie). Dzięki specyfikacjom zamówienia możesz:

  • określić jedno żądanie
  • określić wiele żądań na wielu kontrolerach
  • określić wiele żądań w wielu sesjach

Wiem, że specyfikacje funkcji używają Kapibary, a specyfikacje żądań nie. Ale to raczej nie zasługuje na różne koncepcje.

zaszkodzić
źródło

Odpowiedzi:

147

Różnica koncepcyjna polega na tym, że zazwyczaj testujesz historyjkę użytkownika, a cała interakcja powinna odbywać się za pośrednictwem interfejsu użytkownika. I tu pojawia się Kapibara. Specyfikacja żądania nadal testuje zachowanie twojej aplikacji i nie oczekuje się czytelności, jaką miałby test akceptacyjny. Tak więc dostępna jest funkcja ulepszonej składni testów akceptacyjnych.

Różnice techniczne obejmują testy integracji specyfikacji żądań z Railsami, podczas gdy specyfikacje funkcji nie. Oznacza to, że w przypadku specyfikacji żądań możesz używać metod get, post, put, delete i potwierdzać odpowiedź. Dzięki specyfikacjom funkcji należy kierować całą interakcją za pośrednictwem przeglądarki i używać metod takich jak odwiedzanie i potwierdzanie strony.

Polecam przeczytać opis feature_spec.feature w kodzie źródłowym rspec-rails na github. Mam nadzieję, że to pomoże.

Richard Jordan
źródło
2
Czy poleciłbyś więc używanie zarówno specyfikacji funkcji, jak i żądań, czy też jedna lub druga jest wystarczająca? (Bycie nowym w TDD ...)
robertwbradford
2
Używam obu, @robertwbradford. Używam specyfikacji funkcji, aby kierować moją zewnętrznością w testach - testując wrażenia użytkownika, a następnie budując funkcjonalność za pomocą testów jednostkowych. Używam specyfikacji żądań do testowania odpowiedzi - np. W sesjach_spec mogę mieć "GET /login"blok opisu z oczekiwaniami w itblokach takich jak expect(response.status).to eq(200)i expect(response).to render_template(:new), lub w bloku describe "POST /sessions"a context "with valid credentials", z expect(response).to redirect_to(user)ifollow_redirect!; expect(response.body).to include("Signed in")
Richard Jordan
5
Czy używasz też specyfikacji kontrolera? Wygląda na to, że istnieje pewne podwojenie między tym, co testujesz w specyfikacjach żądania, a tym, co zwykle jest testowane w specyfikacjach kontrolera.
Ernesto,
5
Mówiąc to, powyższy post, do którego prowadzi link, jasno opisuje różnice. Użyj specyfikacji żądania do testowania przez API, użyj specyfikacji funkcji do testowania przez frontend.
Damien Roche
2
@RichardJordan: Pytanie: Czy w specyfikacjach funkcji zaleca się używanie ścieżek Railsowych (tj. visit users_path) Lub zakodowanych na stałe ciągów znaków ( visit '/users') ?. Osobiście wolę nie używać żadnych wewnętrznych elementów aplikacji w tego rodzaju specyfikacjach.
tokland,