2011-01-12 6 views
1

Ich versuche, eine RSpec-Controller-Spezifikation zu erhalten. Es ist fast identisch mit der Scaffold-generierten Spezifikation, außer dass ein Benutzer zuerst in Devise eingetragen wird. Wenn Ich 'load_and_authorize_resource' von der Steuerung (die Berechtigungen überprüft) deaktivieren, funktioniert alles einwandfrei. Aber wenn ich die Zeile zurück in setzen, schlägt es mit:RSpec Neuling: Devise/Cancan, die sonst funktionierende Controller-Spezifikation verursacht, fehlzuschlagen

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)>' 

ich der Spezifikation angenommen hatte, wurde nicht richtig in dem Benutzer anzumelden, sondern eine puts current_user.role.name bestätigt der Benutzer korrekt angemeldet ist, und hat die notwendige Rolle. Das Ausführen des tatsächlichen Prozesses in einem Browser bestätigt, dass es wie gewünscht funktioniert.

Hat jemand irgendwelche Vorschläge? Ich bin ziemlich ratlos. Controller unter:

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 

... Und die spec

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 

... Und die Unterstützung Sachen in der Spezifikation:

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

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

Vielen Dank ...

Antwort

1

Try Upgrade von CanCan auf Version 1.5. Ich hatte das Problem früher, aber ich denke, es ging weg, wenn ich ein Upgrade durchführte.