Я новичок в 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
) не работает? - Как мне отправить фиктивный объект контроллеру?
- Почему ожидаемая версия работает?
Любое понимание вопросов будет высоко оценено. Я чесал голову, пытаясь понять это, и я предполагаю, что это очевидный ответ.