【问题标题】:RSpec functional test is redirecting to the wrong placeRSpec 功能测试重定向到错误的地方
【发布时间】:2012-06-02 15:42:23
【问题描述】:

我需要一些帮助,试图通过这个测试但没有运气。

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 部分编写测试?

【问题讨论】:

  • login_user 应该进入 before(:each) 块;不要硬编码 mock_post ID 的值。只需调用它,即将1001 替换为mock_post.id;使put 测试操作符合预期。对每个示例重复 put 测试操作。
  • 好的。按照您的指示更新了帖子。 login_user 是我从Devise wiki page 复制的ControllerMacro
  • 检查log/test.log,它可能会告诉你为什么重定向没有发生。

标签: testing rspec mocking bdd stub


【解决方案1】:

您的规范从不调用控制器操作。尝试添加:

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

要测试调用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

【讨论】:

  • 嗨,谢谢,但你从哪里得到@post?我没有。
  • 我更新了我的帖子。我已经对代码进行了一些更改,所以它几乎可以工作了。请看一下。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 2016-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多