Вам необходимо передать ключевые параметры в действие. И это хорошая идея, чтобы проверить не только статус ответа, но и результат действия
it 'updates key' do
# supposing that "note" is a string column
expect do
put :update, project_id: @project.id, id: @key.id, key: { note: 'New note' }
end.to change { @key.note }.from('Old note').to('New note')
expect(response.code).to eq "302"
end
UPDATE:
В контроллере вы пытаетесь найти экземпляр ключа по ключевому атрибуту
@key = current_user.keys.find_by_key(params[:id])
но вы передаете key.id в спецификации. Как это работает в приложении? Я полагаю, вы передаете ключ как :id
параметр, поэтому он должен быть
put :update, project_id: @project.id, id: @key.key, key: { note: 'New note' }
в ваших спецификациях. Кроме того, find_by_key
не вызывает ошибку, если ничего не может найти, просто возвращает ноль. Это означает, что вы не получите RecordNotFound. Более того, это устаревший метод, вы должны использовать find_by(key: params[:id])
Чтобы вызвать ошибку, используйте метод bang find_by!(key: params[:id])
Если вы передаете key.id
в приложение, вам нужно внести изменения в действие контроллера
@key = current_user.keys.find(params[:id])