如何使用rspec测试301重定向?

时间:2010-10-18 16:55:41

标签: ruby-on-rails testing rspec

我需要测试两件事:

  1. 某些旧路径已正确重定向到某些新路径
  2. 重定向是301,而不是302。
  3. 我正在使用Capybara进行验收测试,但是无法处理#2。我可以测试重定向是否发生,但它是静默发生的,所以我看不出它是301。

    控制器测试无法处理#1。 rspec为控制器测试提供的“get”,“post”等谓词只允许您传入操作,而不是特定路径,并且重定向是基于路径在单个操作中实现的,如下所示:

    # controller
    class ExampleController
      def redirect301
        redirect_to case request.path
        when '/old_a'
          '/new_a'
        when '/old_b'
          '/new_b'
        end, :status => 301
      end
    end
    
    # routes.rb
    ['old_a', 'old_b'].each do |p| 
      map.connect p, :controller => :example, :action => :redirect301
    end
    

    那么,我该怎么办?

3 个答案:

答案 0 :(得分:4)

试试这个:

it "should redirect with 301" do
  get :action
  response.code.should == 301
end

答案 1 :(得分:0)

要测试响应状态,请执行此操作 - expect(response.status).to eq(301) 并测试响应网址 - expect(response.location).to eq(my_path)

所以它应该看起来像这样:

it "should redirect with a 301 status code to my_path" do
  get :action
  expect(response.status).to eq(301)
  expect(response.location).to eq(my_path)
end

答案 2 :(得分:0)

使用rspec-rails 2.12.0和现代expect语法,这是正确的格式:

  it "should redirect with a 301 status code to /whatever_path" do
    get :some_action
    expect(response).to redirect_to '/whatever_path' # or a path helper
    expect(response.code).to eq '301'
  end

注意字符串301 - 当我使用整数运行此规范时,它失败了,将301与Ruby中的“301”进行比较,而Ruby中的不相等。