Как проверить с Rspec, если письмо доставлено

Если вам абсолютно нужна локальная копия файла, вам нужно будет открыть InputStream копию содержимого в локальный файл, в котором вы знаете путь, а затем перейти оттуда. Sidenote: Guava ByteStreams#copy - это простой способ выполнить это.

Конечно, этот файл больше не поддерживается исходным источником Uri, поэтому я не думаю, что это то, что вы хотите. Вместо этого вы должны работать с API-интерфейсом Uri. Взгляните на Storage Access Framework

Изменить

Вот как вы можете получить InputStream из вашего Uri

InputStream inputStream = getContentResolver().openInputStream(uri);

29
задан ROMANIA_engineer 18 June 2017 в 01:45
поделиться

8 ответов

Если ваша тестовая среда настроена обычным образом (то есть у вас есть config.action_mailer.delivery_method = :test), то доставленные электронные письма вставляются в глобальный массив ActionMailer::Base.deliveries как Mail::Message экземпляры. Вы можете прочитать это из своего теста и убедиться, что электронная почта соответствует ожидаемой. См. здесь .

52
ответ дан Chowlett 18 June 2017 в 01:45
поделиться

Чтобы добавить немного больше, убедитесь, что если вы собираетесь заблокировать вызов с помощью should_receive, у вас есть интеграционный тест, проверяющий, что вы действительно вызываете метод правильно.

Я был несколько раз, меняя метод, который был протестирован в другом месте, с must_receive, и тесты все еще проходили, когда вызов метода был прерван.

Если вы предпочитаете проверять результат, а не использовать should_receive, у musta есть хороший инструмент для сопоставления, который работает следующим образом:

it { should have_sent_email.with_subject(/is spam$/) }

Следует документация

Дополнительная информация об использовании musta Matchers с rSpec

1
ответ дан Jared 18 June 2017 в 01:45
поделиться

Если вы используете Capybara с E-mail Capybara , и вы отправили электронное письмо на test@example.com, вы также можете использовать этот метод:

email = open_email('test@example.com')

И тогда вы можете проверить это так:

expect(email.subject).to eq('SUBJECT')
expect(email.to).to eq(['test@example.com'])
1
ответ дан Tomasz Giba 18 June 2017 в 01:45
поделиться

Сконфигурируйте свою тестовую среду для накопления отправленных писем в ActionMailer::Base.deliveries.

# config/environments/test.rb
config.action_mailer.delivery_method = :test

Тогда что-то вроде этого должно позволить вам проверить, что письмо было отправлено.

# Sample parameters you would expect for POST #create.
def reservation_params
  { "reservation" => "Drinks for two at 8pm" }
end

describe MyController do
  describe "#create" do
    context "when a reservation is saved" do
      it "sends a confirmation email" do
        expect { post :create, reservation_params }.to change { ActionMailer::Base.deliveries.count }.by(1)
      end
    end
  end
end

Обратите внимание, что в моем примере используется синтаксис RSpec 3.

20
ответ дан Dennis 18 June 2017 в 01:45
поделиться

Для записи, любому, кто использует rspec 3.4 и ActiveJob для отправки асинхронных электронных писем, вы можете проверить это с помощью:

expect {
  post :create, params
}.to have_enqueued_job.on_queue('mailers')
4
ответ дан Alter Lagos 18 June 2017 в 01:45
поделиться

Я знаю, что опаздываю на вечеринку с этим, но для будущих гуглеров ...

Я думаю, что лучшее решение этой проблемы дано здесь

. Ранее принятый ответ - тестирование самого почтовика (внутри спецификации контроллера). Все, что вам следует здесь проверить, - это то, что Mailer получит указание доставить что-то с правильными параметрами.

Затем вы можете проверить Mailer в другом месте, чтобы убедиться, что он правильно реагирует на эти параметры.

ReservationMailer.should_receive (: verify_email) .with (an_instance_of (Reservation))

18
ответ дан Community 18 June 2017 в 01:45
поделиться

Это способ проверить, что Mailer вызывается с правильными аргументами. Вы можете использовать этот код в спецификации функции, контроллера или почтовой программы:

delivery = double
expect(delivery).to receive(:deliver_now).with(no_args)

expect(ReservationMailer).to receive(:confirm_email)
  .with('reservation')
  .and_return(delivery)
2
ответ дан boblin 18 June 2017 в 01:45
поделиться

Попробуйте email-spec

describe "POST /signup (#signup)" do
  it "should deliver the signup email" do
    # expect
    expect(UserMailer).to(receive(:deliver_signup).with("email@example.com", "Jimmy Bean"))
    # when
    post :signup, "Email" => "email@example.com", "Name" => "Jimmy Bean"
  end
end

больше примеров здесь: https://github.com/email-spec/email-spec#testing-in-isolation

-1
ответ дан Ramesh Kumar Thiyagarajan 18 June 2017 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: