Сообщение Rspec: создать 'неизвестное ключевое слово:'

Я новичок в Rspec и пытаюсь проверить свои методы контроллера на базовую функциональность. Я знаю, что не должен тестировать базовую функциональность, но я делаю это больше для обучения, чем для создания чего-то.

У меня есть контроллер с именем ProtocolsController. Контроллер используется для основных функций CRUD. Я пытаюсь протестировать метод контроллера #create. Ниже мой контроллер #create:

def create
    @protocol = Protocol.new(protocol_params)

    if @protocol.save
      flash[:notice] = 'New protocol added'
      redirect_back(fallback_location: 'test_results#index')
    else
      flash[:notice] = @protocol.errors[:name]
      render 'new'
    end
  end

Чтобы проверить печальный путь, я хочу передать контроллеру mock-объект, содержащий необходимые параметры для создания экземпляра класса Protocol. Для этого у меня есть следующий код:

  describe '#create' do
    it 'fails to save because the name already exists' do
      params = FactoryGirl.attributes_for(:protocol)
      post :create, :protocol => params
    end
  end 

Теперь я знаю, что тест не завершен, но я тестирую одну строку за раз, и когда я запускаю Rspec, я получаю следующую ошибку:

Failure/Error: post :create, :protocol => params

     ArgumentError:
       unknown keyword: protocol

Но когда я меняю сообщение на: expect { post :create, :protocol => params }

Оно работает. Что подводит меня к моим вопросам:

  • Почему первый пост (post :create, :protocol => params) не работает?
  • Как мне отправить фиктивный объект контроллеру?
  • Почему ожидаемая версия работает?

Любое понимание вопросов будет высоко оценено. Я чесал голову, пытаясь понять это, и я предполагаю, что это очевидный ответ.


person Darkisa    schedule 10.10.2017    source источник
comment
Какую версию RSpec вы используете?   -  person André Guimarães Sakata    schedule 11.10.2017
comment
последняя версия -› 3.6   -  person Darkisa    schedule 11.10.2017


Ответы (1)


То, как вы вызываете post, больше не работает в Rails 5.

Это предупреждение об устаревании предыдущей версии:

В будущих версиях Rails методы HTTP-запроса ActionController::TestCase будут принимать только аргументы ключевого слова.

Теперь вам нужно добавить ключ params, например:

post :create, params: { protocol: params }

Обратите внимание, что post :create, :params => { :protocol => params } означает то же самое, это просто другой синтаксис.

person André Guimarães Sakata    schedule 10.10.2017