2011-12-26 65 views
0

我不明白为什么这个RSpec测试失败。有什么建议?
我尝试处理帖子的销毁。只有创建帖子的用户才能删除它们。Ruby的问题与过滤器和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)>' 

回答

0

我认为这是因为前(:每个)块,你必须登录的用户。你有before_filter,这个过滤器只适用于:destroy。所以当你没有登录用户时,你的测试会失败,因为它实际上是一个没有“运行测试”权限的用户。所以,你应该把这个代码前(:每个):

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

如果你告诉我,你用什么身份验证,我可以帮你。我使用康康宝石。所以重点是你必须在每次测试之前登录用户。