轨。测试图片大小的验证

时间:2016-12-02 10:57:18

标签: ruby-on-rails ruby rspec rspec-rails

我的模型验证validate :picture_size,我的模型:

class Post < ApplicationRecord
  belongs_to :user

  default_scope -> { order(created_at: :desc) }

  mount_uploader :picture, PictureUploader

  validates :content, presence: true,
                      length: { maximum: 50_000 }

  validates :theme, presence: true,
                    length: { minimum: 3, maximum: 100 },
                    uniqueness: { case_sensitive: false }

  validates :picture, presence: true

  validate :picture_size

  def to_param
    random_link
  end

  private

  def picture_size
    return unless picture.size > 5.megabytes
    errors.add(:picture, 'Файл должен быть меньше, чем 5МБ')
  end
end

我的上传者:

class PictureUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  process resize_to_limit: [600, 300]

  storage :file

  def default_url
    ActionController::Base.helpers.asset_path("default/no-photo-wide.png")
  end

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end
end

当我运行rails服务器时,它运行良好。但我写了几个测试,它确实以某种方式避免验证并将图片上传到我的商店目录。

我的测试:

let(:large_image) { Rack::Test::UploadedFile.new(File.open(File.join(Rails.root, '/spec/images/large-image.jpg'))) }
    it 'will give error if picture is more then 5mb' do
      post = Post.new(theme: 'foo', content: 'bar)
      post.picture = large_image
      post.save

      puts Post.first.picture

      expect(post.valid?).to be false
    end

但结果是true,而不是false。有些人可以告诉我犯了哪些错误或建议任何其他方法来测试图片大小验证吗?

1 个答案:

答案 0 :(得分:0)

查看https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Validate-attachment-file-size

而不是picture.size,您必须致电picture.file.size.to_f/(1000*1000)