Как выполнить POST с отсутствующим аутентичным токеном в тесте запроса rspec rails?

Я имитирую запрос, поступающий от внешней службы, у которой не будет маркера подлинности. Я хочу, чтобы тест провалился, если skip_before_action :verify_authenticity_token отсутствует.

Как мне сделать это из спецификации запроса Rspec?

В настоящее время я использую post, как показано ниже, но это с радостью принято.

post endpoint, my_json_string, {'CONTENT_TYPE' => "application/json"}

person James EJ    schedule 09.03.2015    source источник


Ответы (2)


Защита от CSRF отключена в тесте среда. Попробуйте включить его использование:

before do
  ActionController::Base.allow_forgery_protection = true
end

after do
  ActionController::Base.allow_forgery_protection = false
end
person Maxim    schedule 09.03.2015
comment
Начиная с Rails 4.2.5.1 и Rspec 3.4, этот метод работает нормально. Я подозреваю, что это правильный способ реализовать решение. - person Martin Streicher; 23.02.2016
comment
Для тестов защиты от CSRF может понадобиться сопоставитель raise_error: expect { post endpoint, my_json_string }.to raise_error(ActionController::InvalidAuthenticityToken). Я думал, что должен был проверить код возврата ответа. - person Franklin Yu; 28.08.2016
comment
Кроме того, номер строки больше не действителен в главной ветке. Как насчет использования тега типа это? - person Franklin Yu; 28.08.2016
comment
@FranklinYu: обновил ссылку. Хорошее предложение. - person jwadsack; 11.07.2017
comment
Хорошее решение даже для Rails 5 (API) в наши дни. - person André Rocha; 17.06.2021

Отключение защиты CSRF мне не помогло. Поэтому я создал этот модуль, который использует тело ответа для получения токена подлинности:

https://gist.github.com/Rodrigora/440220a2e24bd42b7b0c

Затем я могу протестировать запросы на размещение/публикацию, не отключая защиту от подделки:

before do
  @token = login(create(:user, password: 'password'))
end

it 'tests model creation' do
   expect {
     post_with_token 'path/to/model', model_params, @token
   }.to change(Model, :count).by(1)
end
person Rodrigo    schedule 19.09.2015