跳至内容 跳至搜索

Active Storage FixtureSet

Fixture 是组织测试数据的有效方式;简而言之,就是示例数据。

要了解有关 Fixture 的更多信息,请阅读 ActiveRecord::FixtureSet 文档。

YAML

与其他 Active Record 支持的模型类似,ActiveStorage::AttachmentActiveStorage::Blob 记录继承自 ActiveRecord::Base 实例,因此可以使用 Fixture 填充这些记录。

假设一个名为 Article 的模型类,以及其相关的 Fixture 数据,以及相关的 ActiveStorage::AttachmentActiveStorage::Blob 记录的 Fixture 数据

# app/models/article.rb
class Article < ApplicationRecord
  has_one_attached :thumbnail
end

# fixtures/active_storage/blobs.yml
first_thumbnail_blob: <%= ActiveStorage::FixtureSet.blob filename: "first.png" %>

# fixtures/active_storage/attachments.yml
first_thumbnail_attachment:
  name: thumbnail
  record: first (Article)
  blob: first_thumbnail_blob

在处理过程中,Active Record 将为每个 Fixture 条目插入数据库记录,并确保 Active Storage 关系保持完整。

方法
B
P
包含的模块

类公共方法

blob(filename:, **attributes)

生成一个 ActiveStorage::Blob 实例属性的 YAML 编码表示,解析相对于 ActiveSupport::Testing::FileFixtures.file_fixture 提及的目录的文件,并将该文件上传到 Service

示例

# tests/fixtures/active_storage/blobs.yml
second_thumbnail_blob: <%= ActiveStorage::FixtureSet.blob(
  filename: "second.svg",
) %>

third_thumbnail_blob: <%= ActiveStorage::FixtureSet.blob(
  filename: "third.svg",
  content_type: "image/svg+xml",
  service_name: "public"
) %>
# File activestorage/lib/active_storage/fixture_set.rb, line 66
def self.blob(filename:, **attributes)
  new.prepare Blob.new(filename: filename, key: generate_unique_secure_token), **attributes
end

实例公共方法

prepare(instance, **attributes)

# File activestorage/lib/active_storage/fixture_set.rb, line 70
def prepare(instance, **attributes)
  io = file_fixture(instance.filename.to_s).open
  instance.unfurl(io)
  instance.assign_attributes(attributes)
  instance.upload_without_unfurling(io)

  instance.attributes.transform_values { |value| value.is_a?(Hash) ? value.to_json : value }.compact.to_json
end