load 와authorize 자원을 사용할 때 비계 생성 컨트롤러 규범 실패

6408 단어 cancan

묘사

우선, 이것은 rspec문제인지 캔캔캔문제인지 확실하지 않지만, 테스트 오류는 캔캔 조수load_and_authorize_resource를 설치한 후에 발생한 것이기 때문에 여기서 발표합니다.
이 문제를 발생시키기 위해 저는 정상적인 scaffoldrails 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 설명서를 참조하십시오.

좋은 웹페이지 즐겨찾기