编写 Rspec 测试来测试多个嵌套属性

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

我正在尝试编写一个测试来测试对象及其嵌套属性。

我有一个简单的设置:

class Animal < ActiveRecord::Base
 has_many :animal_images
end

class AnimalImage < ActiveRecord::Base
 belongs_to :animal
end

从factory_girl文档中,您可以创建一个关联的对象,如下所示:

FactoryGirl.define do
 factory :animal, class: Animal do

  ignore do
   images_count 1
  end

   after(:create) do |animal, evaluator|
    create_list(:animal_image, evaluator.images_count, animal: animal)
   end
 end 
end

FactoryGirl.define do
  factory :animal_image do

  image { File.open("#{Rails.root}/spec/fixtures/yp2.jpg") }
 end
end

那么我将如何构建一个测试来查看验证图像数量的自定义验证方法?

自定义方法:

def max_num_of_images
 if image.size >= 4
  errors.add(:base, "Only 3 images allowed")
 end
end

但是我应该在 Animal 或 AnimalImage 模型中的哪里使用它?我是否可以假设 AnimalImage 模型,因为我可以访问图像属性?

到目前为止我有这个:

it 'is invalid with 4 images' do
 animal = FactoryGirl.create(:animal, images_count: 4)
 animal_image = AnimalImage.create!(animal: animal, image: #how do i pass the 4 images i created earlier)
 ap(animal)
 ap(animal_image)
end

所以 ap(animal) 将返回:

#<Animal:0x00000001c9bbd8> { :id => 52 }

ap(animal_image) 将返回:

#<AnimalImage:0x00000005457b30> { :id => 231, :animal_id => 52 }

我需要做的是使用相同的animal_id创建4个animal_images,并让我的验证失败,因为有超过3个图像。我该怎么办?

ruby-on-rails ruby ruby-on-rails-4 rspec factory-bot
1个回答
0
投票

如果我理解正确,您可以创建图像数组,例如:

FactoryGirl.define do
  factory :animal do
   name 'monkey'

    trait :with_image
      create_list(:animal_images, 3)
    end

    trait :with_5_images
      create_list(:animal_images, 5)
    end
  end 
end

FactoryGirl.define do
  factory :animal_image do
    image { File.open("#{Rails.root}/spec/fixtures/yp2.jpg") }
  end
end

describe Animal do
  subject(:animal) { build :animal, :with_images }
  let(:invalid_animal) { build :animal, :with_5_images }

  it { expect(subject.valid?).to be_truthy }
  it { expect(invalid_aminal.valid?).to be_falsy }
end
© www.soinside.com 2019 - 2024. All rights reserved.