2015-02-03 2 views
0

Rails 컨트롤러 테스트/스펙이 왜 그렇게 구성되었는지에 대한 이유를 이해하지 못한다는 것을 알고 있습니다.Rails 컨트롤러 테스트를 작성할 때 #post vs #get vs #delete?

컨트롤러 테스트를 작성할 때 컨트롤러를 하나의 단위로 취급하고 컨트롤러의 입력과 출력에 대해서만주의하면서 단위 테스트를 작성하는 것이 좋습니다. 예를 들어, 데이터베이스의 특정 상태를 설정하고 로그인하는 사용자를 시뮬레이트하기 위해 일부 Devise 메소드를 스터핑하고, 우리가 post :create 또는 무엇이든 호출하면 해당 컨트롤러 조치로 전송 된 params의 해시를 추가합니다.

그런 다음 출력을 위해 데이터베이스의 결과 상태를 확인하고 응답 HTTP 코드와 리디렉션 등을 확인하고 템플릿 렌더링 프로세스로 전달되는 할당 된 변수를 확인합니다.

컨트롤러는 다양한 RESTful 액션을 실행하기 위해 public 메소드가 호출되는 Ruby 클래스입니다. 따라서 컨트롤러 사양에서는 /kittens/new과 같은 URL을로드하지 않습니다. 대신 get :new처럼 컨트롤러 작업을 직접 호출합니다. 경로는 관련성이없는 것으로 간주됩니다. 그것들은 주어진 요청을 호출 할 컨트롤러 액션을 결정하는 시스템의 또 다른 부분 일뿐입니다.

왜 우리는 HTTP 방법을 지정해야합니까 (같은 get, post, put, delete) 컨트롤러 액션을 호출 할 때? 라우팅이 작동하는 방식의 일부인 외부적인 세부 사항이 아닙니까?

호기심에서 벗어나 컨트롤러 사양 중 하나를 선택하여이 모든 방법을 전환하여 delete :showget :create과 같은 것으로 끝 맺었습니다. 아무 것도 고장났습니다. 그래서 철저히 혼란 스럽습니다. 컨트롤러 사양에서 테스트중인 코드와 관련이없는 경우이 두 메서드를 구별해야하는 이유는 무엇입니까?

답변

1

이것이 여전히 주변에 있지만 사전 REST가 아닌지 확실하지 않습니다. 많은 응용 프로그램이 newcreate에 대해 동일한 종단점을 사용했습니다. (컨트롤러에 new_review 액션이있을 수도 있고 GET으로 공격하면 리뷰 폼이 표시되고 POST으로 공격하면 리뷰를 저장할 수 있습니다.) 이러한 컨트롤러에서 작업을 수행하면 if request.post?이 표시됩니다.

요즘에는 그다지 자주 발견되지 않지만 여전히 지원됩니다. 따라서 HTTP 메서드를 테스트에 넣으면 request 개체가 컨트롤러 동작에서 예상대로 작동하는지 확인할 수 있습니다.

+0

아, 알았어요. 그래, 그 중 몇 가지를 보았고 "와우, 컨트롤러 동작 수를 줄이는 훌륭한 방법"이라고 생각했지만 실제로 테스트에 대한 영향은 생각하지 못했습니다. 감사! –

0

바와 같이

REST 데이터의 의미를 액세스하는 방법은 여기 (REST API - why use PUT DELETE POST GET?) 합산. REST에 요청이 표시되면 즉시 데이터에 이 발생했는지 확인해야합니다.

따라서, 사용자는 동작 호출을 유발하기 위해 HTTP 동사를 사용합니다.

이것은 7 가지 기본 컨트롤러 동작 중 하나를 사용하지 않는 시나리오에서 중요합니다. 예를 들어, disable_accounts, 우리는 GET /disabled_accounts 또는 PATCH /disabled_accounts을 제안합니까?

+0

여기에 REST 동사가 일반적으로 중요한 이유가 요약되어 있지만 내 질문에는 답을하지 않는 것 같습니다. 즉, 원하는 REST 동사가 이미 컨트롤러 사양에서이 REST 동사를 사용해야하는 이유는 무엇입니까? 이름으로 행동? REST 동사를 이해하면 주로 호출 할 컨트롤러 액션을 결정하는 데 사용되므로 컨트롤러를 테스트 할 때 외부 세부 사항처럼 보일 수 있습니다. –