1

このテストに合格しようとしていますが、運が悪かったので、助けが必要です。

describe 'PUT posts/:id' do 

  describe 'with valid attributes' do

    let(:mock_post) { mock_model('Post', title: 'hey! iam a mock!', description: 'a sexy model', location: 'everywhere') }

    login_user

    it 'should update the object and redirect to the post' do 
      Post.stub!(:find).with(mock_post.id).and_return(mock_post)

      Post.any_instance.should_receive(:update_attributes).with({"these" => "params"}).and_return(true)

      response.should redirect_to post_path(mock_post)

      put :update, id: mock_post.id, post: { these: 'params' }
    end

    it 'should have a current_user' do 
      subject.current_user.should_not be_nil
    end

  end

今のところ、上記のテストのようなものがあり、次のエラーが発生します。

1) PostsController PUT posts/:id with valid attributes should update the object and redirect to the post
     Failure/Error: response.should redirect_to post_path(mock_post)
       Expected response to be a <:redirect>, but was <200>
     # ./spec/controllers/posts_controller_spec.rb:200:in `block (4 levels) in <top (required)>'

PostsController:

class PostsController < ApplicationController
  load_and_authorize_resource except: [:index, :show]
  before_filter :authenticate_user!, except: [:index, :show, :tags]
  before_filter :find_post, only: [:show, :edit, :update, :suspend, :suspend_alert]

def update
  if @post.update_attributes(params[:post])
    flash[:success] = 'Cool.'
    redirect_to post_path(@post)
  else
    render :edit
  end
end

protected
  def find_post
    @post = Post.find(params[:id])
  end
end

また、render :editパーツのテストはどのように作成すればよいですか?

4

1 に答える 1

2

スペックがコントローラーアクションを呼び出すことはありません。追加してみてください:

Post.any_instance.
  should_receive(:update_attributes).
  with({"these" => "params"})
put :update, :id => "1", :post => {"these" => "params"}

の呼び出しから生じる2つのパスをテストするupdate_attributesには、期待値の値を代入します。

it "should redirect when successful" do
  Post.any_instance.
    should_receive(:update_attributes).
    with({"these" => "params"}).
    and_return(true)`
  response.should_redirect_to(post_path(@mock_post))
  put :update, :id => "1", :post => {"these" => "params"}
end

it "should render the edit page when unsuccessful" do
  Post.any_instance.
    should_receive(:update_attributes).
    with({"these" => "params"}).
    and_return(false)`
  response.should render_template("edit")
  put :update, :id => "1", :post => {"these" => "params"}
end
于 2012-06-02T20:43:47.720 に答える