如何测试主动存储维度验证?

问题描述 投票:0回答:1

我已经安装了这个 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
ruby-on-rails ruby rspec automated-tests rails-activestorage
1个回答
0
投票

您的问题

您的问题来自这里

摘录:

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 LogPull Request)。这意味着依赖其存在的 gem 现在应该明确要求它,他们可能从一开始就应该这样做,因为当已经需要文件时
require
的开销非常低。

© www.soinside.com 2019 - 2024. All rights reserved.