RSpec : 기능과 요청 사양의 차이점은 무엇입니까?


113

Rspec의 기능 사양요청 사양 의 개념적 차이점은 무엇입니까 ?

기능 사양 문서에서 :

기능 사양은 애플리케이션을 통해 일부 기능을 실행하기위한 고수준 테스트입니다. 일반적으로 웹 페이지와 같은 외부 인터페이스를 통해서만 애플리케이션을 구동해야합니다.

요청 사양의 경우 :

요청 사양은 Rails의 통합 테스트에 대한 얇은 래퍼를 제공하며 라우팅 (Rails에서 제공)을 포함하여 전체 스택을 통해 동작을 유도하고 스터 빙없이 (사용자가 원하는대로) 동작하도록 설계되었습니다. 요청 사양으로 다음을 수행 할 수 있습니다.

  • 단일 요청 지정
  • 여러 컨트롤러에서 여러 요청 지정
  • 여러 세션에서 여러 요청 지정

기능 사양은 Capybara를 사용 하고 요청 사양은 사용 하지 않는다는 것을 알고 있습니다. 그러나 그것은 다른 개념의 가치가 거의 없습니다.

답변:


147

개념상의 차이점은 일반적으로 사용자 스토리를 테스트하고 모든 상호 작용이 사용자 인터페이스를 통해 이루어져야한다는 것입니다. 이것이 Capybara가 등장하는 곳입니다. 요청 사양은 여전히 ​​애플리케이션의 동작을 테스트하고 있으며 수락 테스트가 가질 수있는 가독성을 기대하지 않습니다. 따라서 수용 테스트를위한 향상된 구문을위한 기능이 있습니다.

기술적 차이점에는 요청 사양이 Rails 통합 테스트를 래핑하는 반면 기능 사양은 그렇지 않습니다. 이는 요청 사양을 사용하여 응답에 대해 get, post, put, delete 및 assert 메서드를 사용할 수 있음을 의미합니다. 기능 사양을 사용하면 브라우저를 통해 모든 상호 작용을 유도하고 페이지에 대한 방문 및 주장과 같은 방법을 사용해야합니다.

github의 rspec-rails 소스 코드에서 feature_spec.feature를 읽는 것이 좋습니다. 이게 도움이 되길 바란다.


2
따라서 기능 및 요청 사양을 모두 사용하는 것이 좋습니다. 아니면 둘 중 하나만으로 충분합니까? (... TDD에 새 인)
robertwbradford

2
둘 다 @robertwbradford를 사용합니다. 기능 사양을 사용하여 테스트에서 외부를 주도합니다. 사용자 경험을 테스트 한 다음 단위 테스트를 사용하여 기능을 구축합니다. 나는 응답을 테스트하기위한 요구 사양을 사용 - 예에서 sessions_spec 나는이 설명 할 수 있습니다 "GET /login"에 기대 블록 it과 같은 블록 expect(response.status).to eq(200)expect(response).to render_template(:new), 또는에서 describe "POST /sessions"하는 context "with valid credentials"블록으로 expect(response).to redirect_to(user)하고follow_redirect!; expect(response.body).to include("Signed in")
리처드 조던

5
컨트롤러 사양도 사용합니까? 요청 사양에서 테스트하는 것과 컨트롤러 사양에서 일반적으로 테스트하는 것 사이에 약간의 중복이있는 것 같습니다.
Ernesto 2014 년

5
즉, 위 링크 된 게시물은 차이점을 명확하게 설명합니다. API를 통해 테스트하려면 요청 사양을 사용하고 프런트 엔드를 통해 테스트하려면 기능 사양을 사용하세요.
Damien Roche

2
@RichardJordan : 질문 : 기능 사양에서 Rails 경로 (예 :) visit users_path또는 하드 코딩 된 문자열 ( visit '/users') 을 사용하는 것이 좋습니다. 개인적으로 이러한 사양에서는 앱 내부를 사용하지 않는 것을 선호합니다.
tokland
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.