如何用Rspec测试强对数?

Mol*_*far 12 ruby rspec ruby-on-rails rspec-rails ruby-on-rails-4

使用Rspec在Rails控制器中测试强params过滤的实际策略是什么?(除了应该匹配)如何编写失败的测试然后使其变为绿色?

zis*_*she 12

创建具有预期和所有(未满足)参数的2个哈希.然后将所有参数传递给动作并检查您是否只接收预期参数的模型.如果您没有使用强参数过滤器,则不会.然后添加权限params并再次检查测试.

例如,这个:

# action
def create
  User.create(params)
end

# spec
it 'creates a user' do
  expect_any_instance_of(User).to receive(:create).
    with({name: 'Sideshow Bob'}.with_indifferent_access)
  post :create, user: 
    { first_name: 'Sideshow', last_name: 'Bob', name: 'Sideshow Bob' }
end
Run Code Online (Sandbox Code Playgroud)

将所有参数传递给用户,测试将失败.当你过滤它们时:

def user_params
  params.require(:user).permit(:name)
end
Run Code Online (Sandbox Code Playgroud)

并改变行动User.create(user_params),测试将通过.

  • `create`是在`ActiveRecord :: Base`上定义的类级方法,由`User`继承.因此,当`expect_any_instance(User)`(对'User`的实例的模拟期望)_might_工作时,`expect(User)`(对`User`类的模拟期望)也会起作用并且更小. (3认同)

Mio*_*Mio 11

我个人使用来自thinkbot的shoulda-matcher.

有类似的东西:

it do
  should permit(:first_name, :last_name, :email, :password).
    for(:update, params: params)
end
Run Code Online (Sandbox Code Playgroud)