Rspec 验证失败:照片不能为空

Rspec validation failed: Photo can't be blank

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

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>'

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

在您的 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 是汽车照片的 url。 要将图像保存到 ActiveRecord 中的记录,您应该查看 Active::Storage https://edgeguides.rubyonrails.org/active_storage_overview.html

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

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