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

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

于 2012-05-23T16:29:57.117 回答