RSpec Newbie: Devise / Cancan вызывает сбой работающей спецификации контроллера - PullRequest
1 голос
/ 12 января 2011

Я пытаюсь передать спецификацию контроллера RSpec.Он почти идентичен спецификации, созданной скаффолдами, за исключением того, что пользователь сначала входит в devise. Если Я отключаю «load_and_authorize_resource» из контроллера (который проверяет разрешения), все работает нормально.Но если я вставлю строку обратно, произойдет сбой с:

  1) PostsController logged in administrator POST create with valid params assigns a newly created post as @post
     Failure/Error: post :create, :post => {'title' => 'test title'}
       <Post(id: integer, title: string, cached_slug: string, content: text, user_id: integer, created_at: datetime, updated_at: datetime) (class)> received :new with unexpected arguments
         expected: ({"title"=>"test title"})
              got: (no args)
     # ./spec/controllers/posts_controller_spec.rb:52:in `block (5 levels) in <top (required)>'

Я предположил, что спецификация неправильно регистрирует пользователя, но ставит current_user.role.name подтверждает, что пользователь вошелправильно и имеет необходимую роль.Выполнение фактического процесса в браузере подтверждает, что он работает как нужно.

У кого-нибудь есть какие-либо предложения?Я в тупике.Контроллер ниже:

  def create
    @post = Post.new(params[:post])
    @post.user = current_user
    respond_to do |format|
      if @post.save
        flash[:notice] = "Post successfully created"
        format.html { redirect_to(@post)}
        format.xml  { render :xml => @post, :status => :created, :location => @post }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

... И спецификации

  describe "with valid params" do
    it "assigns a newly created post as @post" do
      Post.stub(:new).with({'title' => 'test title'}) { mock_post(:save => true) }
      post :create, :post => {'title' => 'test title'}
      assigns(:post).should be(mock_post)
    end

... И вспомогательные вещи в спецификации:

before(:each) do
  @user = Factory(:admin)
  sign_in @user
end

  def mock_post(stubs={})
    @mock_post ||= mock_model(Post, stubs).as_null_object
  end

Большое спасибо ...

1 Ответ

1 голос
/ 17 января 2011

Попробуйте обновить CanCan до версии 1.5. У меня была проблема ранее, но я думаю, что она исчезла, когда я обновился.

...