Ruby on rails 3 针对页面修改黑客的Rails集成测试?

Ruby on rails 3 针对页面修改黑客的Rails集成测试?,ruby-on-rails-3,capybara,rspec-rails,Ruby On Rails 3,Capybara,Rspec Rails,我使用的是Capybara 1.1.2、Rails 3.1.3、rspec Rails 2.9.0和Ruby 1.9.3p0 假设应用程序中有标准和帐户管理用户。标准用户可以创建另一个标准用户,但标准用户不能创建帐户\管理员用户 当然,UI没有给标准用户创建帐户管理员的选项。但是使用Firebug需要30秒,用户可以重新编写HTML,这样它就可以提交一个POST请求来创建一个帐户\ u admin 我如何测试我的应用程序是否可以防止这种简单的黑客行为 正常的标准用户测试如下所示: context

我使用的是Capybara 1.1.2、Rails 3.1.3、rspec Rails 2.9.0和Ruby 1.9.3p0

假设应用程序中有标准和帐户管理用户。标准用户可以创建另一个标准用户,但标准用户不能创建帐户\管理员用户

当然,UI没有给标准用户创建帐户管理员的选项。但是使用Firebug需要30秒,用户可以重新编写HTML,这样它就可以提交一个POST请求来创建一个帐户\ u admin

我如何测试我的应用程序是否可以防止这种简单的黑客行为

正常的标准用户测试如下所示:

context "when standard user is signed in" do

  before do
    login_as standard_user
    visit users_path       # go to index
    click_link('Add user') # click link like user would
  end

  describe "when fields are filled in" do

    let(:new_email) { "new_user@example.com" }

    before do
      fill_in "Email", with: new_email
      fill_in "Password", with: "password"
      fill_in "Password confirmation", with: "password"
      choose "Standard user" # radio button for Role
    end

    it "should create a user" do
      expect { click_button submit }.to change(User, :count).by(1)
    end

  end

end
是否有一种方法可以“愚弄”测试,使其获取表单上不允许的值?我尝试将单选按钮视为文本字段,但水豚拒绝将其视为不存在的字段:

fill_in "Role", with: "account_admin" # doesn't work
直接修改参数散列也不起作用:

params[:role] = "account_admin" # doesn't work

我是否必须像编写控制器测试一样编写此测试,直接调用
post:create

水豚作者jnicklas确认水豚无法让应用程序执行UI无法提供的操作。他建议对控制器进行授权测试

但是,在不使用Capybara语法的情况下,用RSpec编写的请求规范允许直接使用HTML动词(以及一些附加的帮助程序),如和文档中所述。因此,您可以使用属性散列,如
get
post
via\u redirect
post\u和
response.body
对象,而不是Capybara的
填充
点击链接
指令和
页面
对象。这类似于控制器测试,但您使用Rails的路由根据提供的路径选择适当的控制器操作。以下是后一种技术的示例:

describe "when standard user attempts to create account_admin user" do

  let(:standard_user) { FactoryGirl.create(:standard_user) }

  let(:attr) { { email: "account_admin@example.com",
                 password: "password",
                 password_confirmation: "password",
                 role: "account_admin" }
              }

  before do
    login_as standard_user
    get new_user_path
  end

  it "should not create a account_admin user" do
    lambda do
      post users_path, user: attr
    end.should_not change(User, :count)
  end

  describe "after user posts invalid create" do
    before { post_via_redirect users_path, user: attr }

    # redirect to user's profile page
    it { response.body.should have_selector('title', text: 'User Profile') }
    it { response.body.should have_selector('div.alert.alert-error', text: 'not authorized') }
  end

end