【问题标题】:Rspec validation failed: Photo can't be blankRspec 验证失败:照片不能为空白
【发布时间】:2021-06-23 11:46:55
【问题描述】:

我正在尝试为具有照片作为强制关联的模型创建测试。 这是我的模型:

class Car < ApplicationRecord
  has_one_attached :photo

  validates :name, uniqueness: true
  validates :name, presence: true
  validates :photo, presence: true
end

这是我的测试:

require 'rails_helper'

RSpec.describe 'Car', type: :model do
  let(:valid_attributes) do
    {
      name: 'Audi'
    }
  end

  it 'name is unique' do
    Car.create!(name: 'Audi')
    car = Car.new(name: 'Audi')
    expect(car).not_to be_valid
  end
end

测试结果是:

Failures:

  1) Car name is unique
     Failure/Error: Car.create!(name: 'Audi')
     
     ActiveRecord::RecordInvalid:
       Validation failed: Photo can't be blank
     # ./spec/models/car_model_spec.rb:23:in `block (2 levels) in <main>'

我不能做的是附上一张照片进行测试。你有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    如您所料,要通过验证,您必须在测试中添加图片:)

    require 'rails_helper'
    
    RSpec.describe 'Car', type: :model do
      let(:valid_attributes) do
        {
          name: 'Audi'
        }
      end
    
      let(:photo) do
        Rack::Test::UploadedFile.new(
          Rails.root.join('path/to/image.png'), 'image/png'
        )
      end
    
      it 'name is unique' do
        Car.create!(name: 'Audi', photo: photo)
    
        car = Car.new(name: 'Audi', photo: photo)
        expect(car).not_to be_valid
      end
    end
    
    

    【讨论】:

      【解决方案2】:

      在您的 Car 模型中,您有以下内容:

      validates :photo, presence: true
      

      这意味着每个Car 必须有一个photo。当你在你的规范中写下这个时:

      Car.create!(name: 'Audi')
      

      您正在尝试创建没有照片的汽车。因此,错误提示验证失败,因为照片不能为空白。 您可以删除validates :photo, presence: true,或将photo: some_photo_url 传递给Car.create!()

      Car.create!(name: 'Audi', photo: some_photo_url)
      

      其中some_photo_url 是汽车照片的网址。 要将图像保存到 ActiveRecord 中的记录,您应该查看 Active::Storage https://edgeguides.rubyonrails.org/active_storage_overview.html

      【讨论】:

      • 错字:ActiveStorage*
      • 我尝试在创建实例时添加照片的 url,但它不起作用。我也尝试了first_car = car.new(name: 'Audi') first_car.photo.attach(io: File.open('/app/assets/images/'), filename: 'audi.jpeg', content_type: 'image/jpg'),但我没有这样的文件或目录@rb_sysopen
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多