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 ...