ruby-on-rails - Rails/Rspec - 在 Controller 中测试重定向

标签 ruby-on-rails redirect rspec routes

所以我目前正在为之前没有 Controller 的现有 Controller 编写一个测试。我想测试的是当某人不被允许编辑某些内容与某人被允许编辑某些内容时发生的重定向。

正在编辑的 Controller 操作

def edit
  if !@scorecard.reviewed? || admin?
    @company = @scorecard.company
    @custom_css_include = "confirmation_page"
  else
    redirect_to :back
  end
end

因此,如果记分卡已被审核,则只有管理员可以编辑该分数。 该 Controller 的路由..

# scorecards
resources :scorecards do
  member do
    get 'report'
  end
  resources :inaccuracy_reports, :only => [:new, :create]
end

最后是测试

  require 'spec_helper'

  describe ScorecardsController do

    describe "GET edit" do
      before(:each) do
        @agency = Factory(:agency)
        @va = Factory(:va_user, :agency => @agency)
        @admin = Factory(:admin)
        @company = Factory(:company)
        @scorecard = Factory(:scorecard, :level => 1, :company => @company, :agency => @agency, :reviewed => true)
        request.env["HTTP_REFERER"] = "/scorecard"
      end

      context "as a admin" do
        before(:each) do
          controller.stub(:current_user).and_return @admin
        end

        it "allows you to edit a reviewed scorecard" do
          get 'edit', :id => @scorecard.id
          response.status.should be(200)
        end
      end

      context "as a va_user" do
        before(:each) do
        controller.stub(:current_user).and_return @va
      end

      it "does not allow you to edit a reviewed scorecard" do
        get 'edit', :id => @scorecard.id
        response.should redirect_to :back
      end
    end
  end
end

因此,VA 在尝试编辑已审核分数时将被重定向回来,而管理员则不会。

但是当通过 rspec 运行它时我得到了

ScorecardsController
  GET edit
    as a admin
      allows you to edit a reviewed scorecard
    as a va_user
      does not allow you to edit a reviewed scorecard (FAILED - 1)

Failures:

  1) ScorecardsController GET edit as a va_user does not allow you to edit a reviewed scorecard
     Failure/Error: response.should redirect_to :back
   Expected response to be a redirect to </scorecard> but was a redirect to <http://test.host/>
     # ./spec/controllers/scorecards_controller_spec.rb:33:in `block (4 levels) in <top (required)>'

Finished in 0.48517 seconds
2 examples, 1 failure

所以我不知道它是否有效,因为我将 request.env["HTTP_REFERER"] = "/scorecard" 设置为应该是 :back 的位置 因为它在哪里。或者我是否错过了一起看httpstatus的想法我可以使用 300 个回复,但我不知道从哪里开始?

任何帮助都会很棒

编辑

我可以通过这样做来测试它

...
response.status.should be(302)

但我从这个question得到了想法听起来这可能很强大,因为它指定了重定向到的 url。

有人有这样的工作测试吗?

最佳答案

为了使测试更具可读性,您可以这样做: (rspec ~> 3.0)

expect(response).to redirect_to(action_path)

关于ruby-on-rails - Rails/Rspec - 在 Controller 中测试重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16441280/

相关文章:

ruby-on-rails - 应用程序 Controller 的 RSpec 测试失败

ruby-on-rails - Rails 中何时应使用 `DateTime.now.utc` 与 `Time.current.utc`?

apache - http 到 https 导致重定向循环

linux - 将所有输出重定向到一个文件

ruby-on-rails - RSpec 对页面上的元素抛出误报

javascript - 行选择 dataTable rails - 如何获取 id 的选定行列表

ruby-on-rails - 安装在 rails 上的发动机中的 Angular

php - 将网站从 .html 转换为 .php

mysql - 使用 Rspec 和 Capybara、Mysql 事务测试 ajax 自动完成

ruby - RSpec 规范没有运行?