Проблема Ruby с фильтром и RSpec - PullRequest
0 голосов
/ 26 декабря 2011

Я не могу понять, почему этот 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)>'

1 Ответ

0 голосов
/ 23 мая 2012

Я думаю, это потому, что в блоке before (: each) вы должны войти в систему пользователя.У вас есть before_filter, и этот фильтр предназначен только для: destroy.Поэтому, если у вас нет зарегистрированного пользователя, тогда ваши тесты не пройдут, потому что на самом деле это пользователь без прав, который «запускает тест».Поэтому вы должны вставить этот код до (: каждого):

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

Я мог бы помочь вам больше, если вы скажете мне, что вы используете для аутентификации.Я использую cancan gem.Поэтому главное - входить в систему перед каждым тестом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...