Тестирование сильных параметров с musta_matchers - PullRequest
0 голосов
/ 21 декабря 2018

Я с трудом пытаюсь выяснить, как проверить сильные параметры с помощью rspec и shoulda_matchers.

Независимо от того, что я пробовал, я всегда получаю сообщение: RSpec::Expectations::ExpectationNotMetError: Expected POST #create to restrict parameters on :language_name to :name, but it did not restrict any parameters.

Это мой контроллер:

class LanguageNamesController < CrudController
  inherit_resources
  actions :all, :except => [:show]

  private
    def language_name_params
      params.require(:language_name).permit(:name)
    end
end

Это тест:

require 'rails_helper'
RSpec.describe LanguageNamesController, type: :controller do
  describe "parameters" do
    it do
     lm_params = {
       language_name: {
         name: 'John'
       }
     }
     expect(subject).to permit(:name).for(:create, params: { params: lm_params }).on(:language_name)
    end
  end
end

Кроме того, я пробовал это и получил тот же результат:

it do
  subject.params = ActionController::Parameters.new(language_name: {foo: 'bar', name: 'baz'})
  expect(subject).to permit(:name).for(:create).on(:language_name)
end

если я попробую вот так, я получу ArgumentError: unknown keyword: language_name:

it do
 lm_params = {
   language_name: {
     name: 'John'
   }
 }
 expect(subject).to permit(:name).for(:create, params: lm_params).on(:language_name)
end

Я использую:

  • ruby ​​2.5.1
  • rails5.1.6
  • musta-matchers 3.1.2

Кто-нибудь знает, как решить эту проблему?

Спасибо!


Этомой обходной путь, чтобы проверить это:

it do
  faker_name = Faker::Name.name

  params = {
    language_name: {name: faker_name, other_attribute: "other value"},
    extra: {extra: 1}
  }
  get :index, params: params

  expect(subject.send(:language_name_params)).to eq({"name"=> faker_name})
end

1 Ответ

0 голосов
/ 23 декабря 2018

Вам не нужно создавать lm_params.Если собеседники собираются смоделировать объект params для вас.

Если вам нужно только проверить права доступа, вы можете сделать should permit(:name).for(:create)

Если вам нужно проверить значение на разрешенномпараметр: should permit(:name).for(:create, params: {name: 'John'})

В документации есть хорошие примеры для strong_parameters_matcher.rb

РЕДАКТИРОВАТЬ: Другим хорошим источником документации является rubydoc для спичек с горчицей..

...