load 와authorize 자원을 사용할 때 비계 생성 컨트롤러 규범 실패
6408 단어 cancan
묘사
우선, 이것은 rspec문제인지 캔캔캔문제인지 확실하지 않지만, 테스트 오류는 캔캔 조수load_and_authorize_resource
를 설치한 후에 발생한 것이기 때문에 여기서 발표합니다.이 문제를 발생시키기 위해 저는 정상적인 scaffold
rails g scaffold label name:string summary:string
를 생성하여 규범을 controller 규범으로 실행했습니다. 오류가 없습니다.그리고 Desive로 컨트롤러 규격을 수정합니다. 아래와 같이 통과합니다.require 'spec_helper'
include Devise::TestHelpers
describe LabelsController do
before(:each) do
@member ||= Factory.create(:member)
sign_in @member
end
def mock_label(stubs={})
@mock_label ||= mock_model(Label, stubs).as_null_object
end
describe "GET index" do
it "assigns all labels as @labels" do
Label.stub(:all) { [mock_label] }
get :index
assigns(:labels).should eq([mock_label])
end
end
describe "GET show" do
it "assigns the requested label as @label" do
Label.stub(:find).with("37") { mock_label }
get :show, :id => "37"
assigns(:label).should be(mock_label)
end
end
describe "GET new" do
it "assigns a new label as @label" do
Label.stub(:new) { mock_label }
get :new
assigns(:label).should be(mock_label)
end
end
describe "GET edit" do
it "assigns the requested label as @label" do
Label.stub(:find).with("37") { mock_label }
get :edit, :id => "37"
assigns(:label).should be(mock_label)
end
end
describe "POST create" do
describe "with valid params" do
it "assigns a newly created label as @label" do
Label.stub(:new).with({'these' => 'params'}) { mock_label(:save => true) }
post :create, :label => {'these' => 'params'}
assigns(:label).should be(mock_label)
end
it "redirects to the created label" do
Label.stub(:new) { mock_label(:save => true) }
post :create, :label => {}
response.should redirect_to(label_url(mock_label))
end
end
describe "with invalid params" do
it "assigns a newly created but unsaved label as @label" do
Label.stub(:new).with({'these' => 'params'}) { mock_label(:save => false) }
post :create, :label => {'these' => 'params'}
assigns(:label).should be(mock_label)
end
it "re-renders the 'new' template" do
Label.stub(:new) { mock_label(:save => false) }
post :create, :label => {}
response.should render_template("new")
end
end
end
describe "PUT update" do
describe "with valid params" do
it "updates the requested label" do
Label.stub(:find).with("37") { mock_label }
mock_label.should_receive(:update_attributes).with({'these' => 'params'})
put :update, :id => "37", :label => {'these' => 'params'}
end
it "assigns the requested label as @label" do
Label.stub(:find) { mock_label(:update_attributes => true) }
put :update, :id => "1"
assigns(:label).should be(mock_label)
end
it "redirects to the label" do
Label.stub(:find) { mock_label(:update_attributes => true) }
put :update, :id => "1"
response.should redirect_to(label_url(mock_label))
end
end
describe "with invalid params" do
it "assigns the label as @label" do
Label.stub(:find) { mock_label(:update_attributes => false) }
put :update, :id => "1"
assigns(:label).should be(mock_label)
end
it "re-renders the 'edit' template" do
Label.stub(:find) { mock_label(:update_attributes => false) }
put :update, :id => "1"
response.should render_template("edit")
end
end
end
describe "DELETE destroy" do
it "destroys the requested label" do
Label.stub(:find).with("37") { mock_label }
mock_label.should_receive(:destroy)
delete :destroy, :id => "37"
end
it "redirects to the labels list" do
Label.stub(:find) { mock_label }
delete :destroy, :id => "1"
response.should redirect_to(labels_url)
end
end
end
그러나 내가 컨트롤러에 cancan 조수를 추가했을 때 대부분의 테스트가 실패했다.8번의 실패가 있었지만 4번의 실패만 있었다.실패:
1) Labels Controller GET index에서 모든 태그를 @labels로 지정
실패/오류: 할당(: 태그).반드시 eq([mock 태그])
유형 오류:
Rspec::Mocks::Mock#to ary 배열을 반환해야 합니다.
# ./사양/컨트롤러/레이블\u컨트롤러\u사양rb:23
2) 유효한 매개 변수가 있는 Labels Controller 이후의 생성에서 생성된 태그로 리디렉션
실패/오류: 응답. 를 (태그 url(아날로그 태그)로 리디렉션해야 합니다.
예상된 응답은http://test.host/labels/1006그런데 이게 방향이에요.http://test.host/.
# ./사양/컨트롤러/레이블\u컨트롤러\u사양rb:62
3) 유효하지 않은 매개 변수가 있는 Labels Controller를 나중에 만들면 새 템플릿이 다시 표시됩니다.
실패/오류: 응답.렌더링해야 하는 템플릿("신규")
<새로 만들기>이어야 하지만 <"">
# ./사양/컨트롤러/레이블\u컨트롤러\u사양rb:76
4) Labels Controller가 유효한 매개 변수를 사용하여 PUT 업데이트 요청의 레이블
실패/오류: 시뮬레이션 태그.받아야 합니다(: 속성 업데이트).사용({'this'=>'params'})
(레이블 1009 시뮬레이션). 속성 업데이트({"this"=>"params"})
예상: 1회
수신: 0회
# ./사양/컨트롤러/레이블\u 컨트롤러\u 사양rb:85
너무 오래 걸려서 미안해요.나는 rails-3.04, cancan-1.5.1, rspec-rails-2.5
토론 #1
를 사용했다. 첫 번째 버전은 285호에서 언급되었는데, 불행하게도 나는 cancan기능을 파괴하지 않은 상황에서 그것을 복원할 수 없었다.다른 것은 나에게 있어서 모두 새로운 것이다. 보아하니 권한 수여가 실패한 것 같다.게스트 사용자가 모든 작업을 수행할 수 있는지 확인하고 해당 역량 강좌에서 이 기능을 사용하십시오.
def 초기화(사용자)
can:manage,:all
끝맺다
이것이 잘못을 해결할 수 있는지 없는지를 보자.
토론 #2
권한 수여 실패, 사용자가can :manage, :all
능력 등급만 있을 때 모든 테스트를 통과합니다.캐시 루트(데이터베이스에 접촉하지 않음) 때문에 권한을 검사할 수 없습니까?권한 수여 조건과 일치하도록 rspec를 수정하고 실행 상황을 확인하려고 합니다.
토론 #셋
권한 수여가 실패하면 규범이 실패한 원인을 설명할 것입니다. 권한 수여가 실패할 때 규범은 사용자를 루트 url로 다시 지정합니다(새 템플릿 등을 보여주는 것이 아니라).이 조작을 테스트하기 위해서는 이 조작에 접근할 수 있는 적절한 권한을 가진 사용자에게 로그인해야 합니다.자세한 내용은 Controller Testingwiki 설명서를 참조하십시오.
Reference
이 문제에 관하여(load 와authorize 자원을 사용할 때 비계 생성 컨트롤러 규범 실패), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/ryanb/cancan/issues/288텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)