0

RSpecこのテストが失敗する理由がわかりません。何かアドバイス?
私はポストの破壊を処理しようとします。投稿を削除できるのは、投稿を作成したユーザーのみです。

class PostsController < ApplicationController
  before_filter :authorized_user, :only => :destroy

def destroy
  post = Post.find(params[:id])
  post.destroy
  redirect_to posts_path, notice: 'Post successfully destroyed'
end

private  
 def authorized_user
  redirect_to posts_path, notice: 'Access Denied' if current_user.posts.find_by_id(params[:id]).nil?
end

テスト :

describe "DELETE destroy" do
 before(:each) do
   @post = stub_model(Post, :id => 23)
   @post.stub(:destroy){true}
   Post.stub(:find){@post}
 end
 it "should search the post" do
  Post.should_receive(:find).with(@post.id.to_s).and_return(@post)
  delete :destroy, {:id => @post.id }
 end

 it "should destroy the post" do
  @post.should_receive(:destroy)
  delete :destroy, {:id => @post.id }
 end
 it "should redirect to the posts list" do
  delete :destroy, {:id => @post.id }
  response.should redirect_to posts_path
 end
end

そしてエラー:

  1) PostsController DELETE destroy should search the post
 Failure/Error: Post.should_receive(:find).with(@post.id.to_s).and_return(@post)
   (<Post(id: integer, title: string, body: text, created_at: datetime, updated_at: datetime, user_id: integer) (class)>).find("23")
       expected: 1 time
       received: 0 times
 # ./spec/controllers/posts_controller_spec.rb:67:in `block (3 levels) in <top (required)>'
4

1 に答える 1

0

before(:each) ブロックでユーザーにログインする必要があるためだと思います。before_filter があり、このフィルターは :destroy 専用です。したがって、ログインしているユーザーがいない場合、実際には「テストを実行する」権限のないユーザーであるため、テストは失敗します。したがって、このコードを before(:each) に入れる必要があります。

user = way_to_make_user - I do it with: FactoryGirl.create(:user,role=>"client")
controller.sign_in user

認証に何を使用しているか教えていただければ、さらにお手伝いできます。cancan gemを使っています。したがって、要点は、各テストの前にユーザーにログインする必要があるということです。

于 2012-05-23T16:29:57.117 に答える