현재 컨트롤러 사양을 DRY 및 간결하게 유지하고 예제마다 단 하나의 주장을 유지하려고 애쓰는 중입니다. 특히 실제 컨트롤러 요청 호출을 다양한 엣지 케이스와 일치하도록 중첩 된 구조 내에 배치해야하는 경우에 어려움이 있습니다.RSpec을 사용한 DRY 컨트롤러 사양
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
는 분명히 이것은 인위적인 예이지만, 내가하고 싶은 것을하고 작동하지 않는 것을 보여
여기에 문제를 보여주기 위해 간단한 예를 들어,입니다. 주로 "게시되지 않은"컨텍스트 아래의 before
블록이 문제입니다. Context가 중첩되어있는 방식으로 인해 설정 데이터에 실제로 변경 한 내용이 인 경우get
호출이 발생합니다. 따라서 해당 컨텍스트의 예제는 실제로 의도 한 시나리오가 아닌 초기 시나리오에서 작동합니다.
나는 이런 일이 발생하는 이유와 컨텍스트가 어떻게 중첩되는지 이해합니다. 내가 가지고 같은 을 거라고 추측 무엇 나는 그것이 주어진 컨텍스트 내에서 전에 주장을 아직까지 잘 before
어떤 후 후크를 실행하고 싶은 것을 RSpec에 말할 수있는 몇 가지 방법입니다. 이것은 컨트롤러 사양에 적합합니다. 내 컨트롤러 사양에 중첩을 활용하여 get
호출을 분산시키지 않고도 가장자리 사례를 점진적으로 구현하거나 do_get
도우미 호출을 내 it
어설 션에 각각 적용 할 수 있습니다. 이것은 특히 내가 사용하고있는 맞춤 매크로 it_should
과 계속 동기화하는 것이 귀찮습니다.
RSpec에는이 작업을 수행하는 데 필요한 것이 있습니까? 가까운 길을 가기 위해 사용할 수있는 트릭이 있습니까? 그것은 많은 사람들이 자신의 컨트롤러 스펙을 작성하는 것을 본 방식에 완벽하게 어울리는 것 같습니다. 내가 찾은 것에서 사람들은 기본적으로 모든 주장 앞에 도움을 청한 사람들이 do_get
인 것으로 정착했습니다. 더 좋은 방법이 있습니까? 당신을 위해
좋은 지적. 'get' 호출이 반복 되더라도, 스펙을 명료하게 유지하는 것이 보람 될 것입니다. 그래도 REST 액션에 대한 응답을 구체화하는 매우 구체적인 사용 사례가있는 컨트롤러 스펙과 같은 느낌은 그러한 반복을 어떻게 든 줄일 수 있습니다. –
Chris - 나는 일종의 지름길이 좋을 것이라는데 동의하며, 나는 그 아이디어에 대해 개방적이지만, 나는 분명히 적절한 수준의 선명도를 유지하는 것을 보았다. 아이디어가있는 경우 꼭 https://github.com/rspec/rspec-rails/issues에 기능 요청을 제출하십시오. –