我已经安装了这个 gem 来验证和测试活动存储:
gem 'active_storage_validations'
# Asset Model
class Asset < ApplicationRecord
has_one_attached :portrait
validates(
:portrait,
content_type: ['image/png', 'image/jpeg', 'image/svg+xml'],
dimension: { width: { in: 8..512 }, height: { in: 8..512 } },
size: { less_than: 250.kilobytes }
)
end
# Asset test
require 'rails_helper'
RSpec.describe Asset do
it { is_expected.to validate_dimensions_of(:portrait).width_between(8..512) }
end
但是,我在测试中遇到此错误,但在测试中没有出现:
Asset validations is expected to validate the image dimensions of :portrait
Failure/Error: it { is_expected.to validate_dimensions_of(:portrait).height_between(8..512) }
NameError:
uninitialized constant ActiveStorageValidations::Matchers::OpenStruct
您的问题
您的问题来自这里。
摘录:
module ActiveStorageValidations
module Matchers
#...
def self.mock_metadata(attachment, width, height)
if Rails.gem_version >= Gem::Version.new('6.0.0')
# Mock the Metadata class for rails 6
mock = OpenStruct.new(metadata: { width: width, height: height })
宝石似乎期望
OpenStruct
需要 require 'ostruct'
(实际上自己并不需要)。
将
require 'ostruct'
添加到您的spec_helper.rb 文件中,它应该可以解决问题。
如果是这样,我也会在 github 上用 gem 开一张票。
为什么会出现这种情况?
需要旧版本的 json gem
OpenStruct
。 Rails
,或更明确地说 ActiveSupport
,依赖于 JSON
(来源)。
看来,rails gems 的其他一些创建者依赖于
OpenStruct
简单可用的假设(由于其他 gem 依赖性);然而,从版本 2.7.2 开始,json gem 已将 OpenStruct
设为可选(Change Log 和 Pull Request)。这意味着依赖其存在的 gem 现在应该明确要求它,他们可能从一开始就应该这样做,因为当已经需要文件时 require
的开销非常低。