Errno :: ENOENT: нет такого файла или каталога @ rb_file_s_mtime после тестирования возможностей

Вам нужно будет пометить оба ваши представления с помощью уникального имени перехода.

ViewCompat.setTransitionName(imageView, "some_unique_transitionName");

начать новую активность с помощью этой новой информации

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, imageView, ViewCompat.getTransitionName(imageView));

activity.startActivity(intent, options.toBundle());

Теперь, в новом действии : В зависимости от того, как вы открываете свою следующую активность и насколько сложной является ее иерархия, вы могли бы хотеть использовать supportPostponeEnterTransition(); во время onCreate и supportStartPostponedEnterTransition(); когда-нибудь позже, когда она настроена. Я дам вам прочитать документацию для него

. Помимо этого найдите вид нового действия, которое необходимо анимировать, и установите для него имя перехода

activityImage.setTransitionName(transitionName);

и

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

 getWindow().getSharedElementEnterTransition().setDuration(200);
    getWindow().getSharedElementReturnTransition().setDuration(200)
            .setInterpolator(new DecelerateInterpolator());

И переходы входа / выхода для вашей деятельности (вы будете это нужно)

    Fade fade = new Fade();
    fade.excludeTarget(android.R.id.statusBarBackground, true);
    fade.excludeTarget(android.R.id.navigationBarBackground, true);
    getWindow().setEnterTransition(fade);
    getWindow().setExitTransition(fade);

Помните, что общие переходы элементов пересекают всю иерархию представлений, чтобы узнать исходные и целевые представления, и только после того, как целевая активность полностью заложила обратные преобразования структуры, чтобы дать вам иллюзию вы хотите добиться этого, да, если иерархии представлений сложны или действия требуют времени для настройки и т. д. (зависит от сети), вам может понадобиться немного поработать.

6
задан Benj 29 January 2019 в 15:14
поделиться

3 ответа

Что-то не так с тем, как вы настраиваете изображение, с которым вы тестируете. Возможно, вы захотите обновить его до того, как команда Rails будет обрабатывать его в своих собственных тестах:

module ActiveStorageHelpers
  # ported from https://github.com/rails/rails/blob/5-2-stable/activestorage/test/test_helper.rb#L57
  def create_file_blob(filename: "image.jpg", content_type: "image/jpeg", metadata: nil)
    ActiveStorage::Blob.create_after_upload! io: file_fixture(filename).open, filename: filename, content_type: content_type, metadata: metadata
  end
end

RSpec.configure do |config|
  config.include ActiveStorageHelpers
end

Затем поместите крошечный файл изображения в spec/fixtures/file/images.jpg (вот где метод file_fixture будет искать его) .

Имея это в виду, вы можете настроить изображение на вашей модели в вашем функциональном тесте с помощью чего-то вроде:

instance_of_model.images.attach(create_file_blob)
0
ответ дан codenamev 29 January 2019 в 15:14
поделиться

Я не уверен, что вы имеете в виду, за исключением того, что происходит после теста?

Тест должен быть, как правило, атомарным и независимым, поэтому все ресурсы, которые вы создаете, должны быть удалены сразу после завершения теста. Кроме того, тесты выполняются в случайном порядке, поэтому тесты, которые зависят друг от друга, иногда не будут выполняться, а иногда нет, в зависимости от порядка выполнения.

Можете ли вы поделиться результатами или тестами, которые не прошли?

0
ответ дан BvuRVKyUVlViVIc7 29 January 2019 в 15:14
поделиться

Тот факт, что тест пройден, означает, что тест не зависит от того, какое изображение найдено. Неработающая ссылка на изображение, как правило, не приводит к сбою теста, и на самом деле часто авторы тестов даже не удосуживаются предоставить имитированные изображения, потому что это (воспринимается как) слишком много работы и не имеет отношения к тестируемой вещи. .

Смотрите, ребята, вот почему мы просим привести пример . Теперь, когда ОП опубликовал пример , мы можем видеть, что его проблема заключается в кэшировании в браузере, и будет решена заменой

product.images.attach io: File.open(path), filename: 'image.png'

на

product.images.attach io: File.open(path), filename: "image-#{Time.now.strftime("%s%L")}.png"

в помощнике, который делает приложение. Я бы не решил это без примера.

Пояснение

ActiveStorage обрабатывает сохранение и обслуживание файлов. OP сохранял и обслуживал изображения с этим, что определенно предназначалось для этого. Чтобы разные службы могли обслуживать файлы по-разному, ActiveStorage отделяет опубликованный URL-адрес от фактического URL-адреса, обслуживающего изображения.

Опубликованный URL является почти постоянной ссылкой: это закодированная версия ключа базы данных для вложения. ActiveStorage обрабатывает запрос URL-адреса путем поиска места хранения файла и отправки временного перенаправления 302 на URL-адрес, который можно использовать для доступа к файлу, который называется «служебный URL-адрес». При использовании AWS S3 для хранения файлов служебный URL-адрес может быть подписанным URL-адресом, срок действия которого быстро истекает, но, тем не менее, он подключает браузер напрямую к S3, а не через веб-сервер в качестве посредника.

По умолчанию URL-адрес службы действителен в течение 5 минут, и ActiveRecord явно устанавливает

Cache-Control: max-age=300, private

при перенаправлении 302. Браузер кэширует этот ответ на перенаправление, и в течение следующих 5 минут браузер даже не будет пытаться использовать или проверить опубликованный URL-адрес, он немедленно заменит общедоступный URL-адрес на кэшированный URL-адрес службы.

К сожалению, хотя общедоступный URL-адрес предсказуемо воссоздается, URL-адрес службы генерируется случайным образом, поэтому, когда браузер выполняет автоматическое перенаправление, ранее действительный URL-адрес службы больше не работает. Решение (или обходной путь, в зависимости от вашей точки зрения) состоит в том, чтобы различать общедоступные URL-адреса путем добавления метки времени в имени файла, чтобы тесты не использовали повторно общедоступные URL-адреса.

Sidenote

Кстати, вам не следует использовать url_for с image_tag. Измените ваш ERB с

= image_tag url_for(product.image.variant(resize: "120x120"))

на

= image_tag(product.image.variant(resize: "120x120"))

Rails достаточно умен, чтобы справиться с любым случаем, но последний способ является рекомендуемым.

0
ответ дан Old Pro 29 January 2019 в 15:14
поделиться
Другие вопросы по тегам:

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