【问题标题】:RSpec - Testing strong parametersRSpec - 测试强参数
【发布时间】:2013-05-15 20:36:42
【问题描述】:

我在控制器中使用strong_parameters gem,但我很难理解如何测试它。

这是我的设置示例

class UserController < ActionController::Base
  include ActiveModel::ForbiddenAttributesProtection

  def create
    @user = User.new(user_params)
    if @user.save
      ...
    end
  end

  private
  def user_params
    params.require(:user).permit(:first_name, :last_name, :username, :email)
  end
end

我想测试user_params 方法以确保它正确过滤掉恶意键/值对,但不知道该怎么做。有其他人经历过吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 rspec strong-parameters


    【解决方案1】:

    您可以将参数哈希存根为

    params = ActionController::Parameters.new(your_hash)
    

    这是您的 URL 参数在控制器中被转换为的类,它为您提供了 require 和 permit 方法。

    我个人将功能提取到一个新类中来处理授权策略。

    【讨论】:

      【解决方案2】:

      根据你的需要修改这个,

      describe "create action" do
          it 'creates a user' do
            User.should_receive(:create).
              with({name: 'Alan D'}.with_indifferent_access)
            post :create, user:
              { first_name: 'Alan', last_name: 'Donald', username: 'alan77', email: 'mymail@yopmail.com' }
          end
      end
      

      这个问题的其他替代解决方案是:

      describe UsersController::UserParams do
        it 'cleans the params' do
          params = ActionController::Parameters.new(user: {foo: 'bar', name: 'baz'})
          user_params = UsersController::UserParams.build(params)
          expect(user_params).to eq({name: 'baz'}.with_indifferent_access)
        end
      end
      

      【讨论】:

        【解决方案3】:

        我不确定我会测试strong_parameters,我猜你正在通过the gem 使用它。

        gem 有its own tests,所以我们可以假设它按预期工作。

        这是一个“测试 Rails”的例子,我认为这是不必要的。我不会测试 attr_accessible 是否像宣传的那样工作(测试 Rails)或 attr_accessor(测试 Ruby)。

        恕我直言,您的集成测试应涵盖所有所需的成功/失败实例,并隐含涵盖您的 strong_parameter 配置。

        【讨论】:

        • 我们的测试策略是明确地为所有功能编写测试,以便我们以后可以切换 gems/roll 我们自己的,并且仍然知道系统正在运行。
        • 您还可以测试与 strong_parameters 集成的代码是否正常工作。根据用户角色/权限,我有可写/不可写的字段,因此我需要测试这两个部分是否正确集成。
        • 从 Rails 1.1 到 3.2 的应用程序(现在正在准备 4.0),我可以向您保证,测试 Rails 是非常必要的。在一个版本的 Rails 中以一种方式工作的东西可能会改变另一个版本的行为。例如,我曾经使用 clone 方法克隆 activerecord 记录,但在 3.0 和 3.2 之间的某个地方,他们决定 dup 将提供该功能......并且做起来略有不同。这没有很好地宣传,但很快就被我的测试发现了。
        • 是的@sockmonk - 这绝对是你想要测试 Rails 的一种情况:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多