我的模型验证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
。有些人可以告诉我犯了哪些错误或建议任何其他方法来测试图片大小验证吗?
答案 0 :(得分:0)
查看https://github.com/carrierwaveuploader/carrierwave/wiki/How-to:-Validate-attachment-file-size
而不是picture.size
,您必须致电picture.file.size.to_f/(1000*1000)