Один из моих тестов RSpec вызывает ошибку ActionController :: InvalidAuthenticityToken при нажатии на кнопку для отправки электронного письма.
Я попытался добавить:
skip_before_action :verify_authenticity_token, only: [:email_expiration2] if Rails.env.test?
в контроллере,но затем ошибка обрабатывается и перенаправляется на страницу 404.
Что меня смущает, так это то, что тест работает, как и ожидалось, когда выполняется вручную , то есть перемещается по сайту с точки зрения пользователя.Я могу нажать на кнопку, чтобы отправить электронное письмо, и мне показывают желаемое «Напоминание отправлено!»стр.У меня также есть другие тесты, которые следуют точно такой же процедуре и формату для других областей сайта, которые связаны с электронной почтой, и они работают как положено.
Это неудачный тестовый пример:
specify 'I can remind coaches of their certificate expiration' do
login_as @user
@test_user = FactoryBot.create :user, email: 'test@running.com', password: 'testtest', first_name: 'Kirito', last_name: 'Adler'
@test_role = FactoryBot.create :role, role_name: 'Volunteer'
FactoryBot.create :coach, DBS: '12-12-2018', appl_status: true, user_id: @test_user.id
FactoryBot.create :user_role, role_id: @test_role.id, user_id: @test_user.id
visit '/email_application_status'
expect(page).to have_no_content 'Kirito Adler'
visit '/email_expiration'
expect(page).to have_content 'Kirito Adler'
expect(page).to have_content 'Expired (12-12-2018)'
#save_and_open_page
#puts page.body
click_button 'KiritoAdler' <-- this throws error
expect(page).to have_content 'Reminder sent!' <-- this fails
end
Все соответствующие фабрики были объявлены для теста, и все элементы HTML имеют правильные идентификаторы.
Это сбойный метод в контроллере:
def email_expiration2
@user_id = params[:recipent][:user_id]
@user = User.find(@user_id)
@expiration = params[:recipent][:expiration]
UserMailer.new_expiration_mail(@user.email, @user.first_name, @expiration).deliver
end
Часть связанного представления:
- @all_coaches.each do |user|
- coach = Coach.where(:user_id => user.id).first
= simple_form_for :recipent, url: reminder_sent_path, method: :post do |f|
%tr
%td
= user.first_name
= user.last_name
%p
= Role.find(user.user_roles.first.role_id).role_name
%p
Certificate expiration:
- if !coach.DBS.nil?
- @expiration = (((coach.DBS).to_time - @timenow) / 24.hour).ceil
- if @expiration >= 31
= f.label :expiration, "#@expiration", :style => "font-size:18px;color:green"
days
- elsif (@expiration > 1) && (@expiration < 31)
= f.label :expiration, "#@expiration", :style => "font-size:18px;color:orange"
days
- elsif (@expiration == 1) || ((coach.DBS).to_time == @time)
= f.label :expiration, "1 day", :style => "font-size:18px;color:red"
- elsif @expiration < 1
= f.label :expiration, "Expired", :style => "font-size:18px;color:red"
= "(" + coach.DBS + ")"
%br
%br
= f.hidden_field :expiration, :value => @expiration
= f.hidden_field :user_id, :value => coach.id
= f.button :submit, "Email reminder", id: user.first_name + user.last_name, :style => "background-color:black;color:white"
%br
Я ожидаю, что тест обнаружит «Напоминание отправлено!»на странице после нажатия кнопки электронной почты.