Если вам абсолютно нужна локальная копия файла, вам нужно будет открыть InputStream
копию содержимого в локальный файл, в котором вы знаете путь, а затем перейти оттуда. Sidenote: Guava ByteStreams#copy
- это простой способ выполнить это.
Конечно, этот файл больше не поддерживается исходным источником Uri, поэтому я не думаю, что это то, что вы хотите. Вместо этого вы должны работать с API-интерфейсом Uri. Взгляните на Storage Access Framework
Изменить
Вот как вы можете получить InputStream
из вашего Uri
InputStream inputStream = getContentResolver().openInputStream(uri);
Если ваша тестовая среда настроена обычным образом (то есть у вас есть config.action_mailer.delivery_method = :test
), то доставленные электронные письма вставляются в глобальный массив ActionMailer::Base.deliveries
как Mail::Message
экземпляры. Вы можете прочитать это из своего теста и убедиться, что электронная почта соответствует ожидаемой. См. здесь .
Чтобы добавить немного больше, убедитесь, что если вы собираетесь заблокировать вызов с помощью should_receive, у вас есть интеграционный тест, проверяющий, что вы действительно вызываете метод правильно.
Я был несколько раз, меняя метод, который был протестирован в другом месте, с must_receive, и тесты все еще проходили, когда вызов метода был прерван.
Если вы предпочитаете проверять результат, а не использовать should_receive, у musta есть хороший инструмент для сопоставления, который работает следующим образом:
it { should have_sent_email.with_subject(/is spam$/) }
Дополнительная информация об использовании musta Matchers с rSpec
Если вы используете 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'])
Сконфигурируйте свою тестовую среду для накопления отправленных писем в 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.
Для записи, любому, кто использует rspec 3.4 и ActiveJob для отправки асинхронных электронных писем, вы можете проверить это с помощью:
expect {
post :create, params
}.to have_enqueued_job.on_queue('mailers')
Я знаю, что опаздываю на вечеринку с этим, но для будущих гуглеров ...
Я думаю, что лучшее решение этой проблемы дано здесь
. Ранее принятый ответ - тестирование самого почтовика (внутри спецификации контроллера). Все, что вам следует здесь проверить, - это то, что Mailer получит указание доставить что-то с правильными параметрами.
Затем вы можете проверить Mailer в другом месте, чтобы убедиться, что он правильно реагирует на эти параметры.
ReservationMailer.should_receive (: verify_email) .with (an_instance_of (Reservation))
Это способ проверить, что Mailer вызывается с правильными аргументами. Вы можете использовать этот код в спецификации функции, контроллера или почтовой программы:
delivery = double
expect(delivery).to receive(:deliver_now).with(no_args)
expect(ReservationMailer).to receive(:confirm_email)
.with('reservation')
.and_return(delivery)
Попробуйте 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