Devise invitable не создает приглашение в тестовой среде

Я использую Devise для управления пользователями. Он работает в режиме разработки, но не в режиме тестирования. В разработке вызов User.invite! успешно отправляет приглашение. В тесте он молча терпит неудачу - никаких ошибок, просто нулевое значение для всех полей, связанных с приглашением, и счетчик почтовых программ не увеличивается.

Вот как выглядит мой тест (с использованием FactoryGirl и RSpec)

require "rails_helper"
describe "with inviting user" do 

    let(:user) { create(:user) }
    before(:each) do

      Devise.mailer.deliveries = []

      User.invite!({email: user.email}, user)
    end

    after(:each) do
        Devise.mailer.deliveries.clear
    end

    it 'should generate invite token' do
        expect(user.invitation_token).to_not be_nil
    end

    it 'should send an email' do

      expect(Devise.mailer.deliveries.count).to eq(1)
    end
end

Оба теста не пройдены:

 1) with inviting user should generate invite token
     Failure/Error: expect(user.invitation_token).to_not be_nil

       expected: not nil
            got: nil
     # ./spec/mailer/mailer_spec.rb:20:in `block (2 levels) in <top (required)>'

  2) with inviting user should send an email
     Failure/Error: expect(Devise.mailer.deliveries.count).to eq(1)

       expected: 1
            got: 0

       (compared using ==)
     # ./spec/mailer/mailer_spec.rb:28:in `block (2 levels) in <top (required)>'

Я немного в тупике. Любые идеи?


person nilatti    schedule 12.04.2016    source источник
comment
Просто к вашему сведению, я также установил config.action_mailer.perform_deliveries = true в config/environments/test.rb   -  person nilatti    schedule 13.04.2016
comment
Я так понимаю, у тебя это тоже есть config.action_mailer.delivery_method = :test?   -  person James Milani    schedule 13.04.2016
comment
Да, это установлено по умолчанию: config.action_mailer.delivery_method = :test   -  person nilatti    schedule 14.04.2016


Ответы (1)


Вы пробовали проверять поставки ActionMailer::Base.deliveries? Могу поспорить, что ваши электронные письма там.

person James Milani    schedule 12.04.2016
comment
Это также остается равным 0. Я использовал Devise.mailer, потому что ActionMailer ничего не показывал, и я видел где-то еще в стеке, что Devise пропускает ActionMailer. - person nilatti; 13.04.2016
comment
Забавный. В моей тестовой среде ActionMailer::Base.deliveries определенно заполняется моими электронными письмами Devise.... Я поближе посмотрю на свои настройки. Я так понимаю, что в вашей среде разработки электронное письмо действительно отправляется? :-) - person James Milani; 13.04.2016
comment
Да, он отправляет — например, я могу отправить его своему коллеге на его рабочий адрес электронной почты, и он появится в его ящике Thunderbird — от dev. - person nilatti; 14.04.2016
comment
@nilatti Вы отправляете электронные письма через Delayed::Job или через другую фоновую задачу? Возможно, вам придется дать немного времени на сон, если это так. Кроме того, см. этот недавний вопрос, похоже, что это может быть аналогичная проблема, если ваша электронная почта отправляется через какую-то фоновую задачу: stackoverflow.com/questions /36284664/ - person James Milani; 14.04.2016