我正在尝试组合一个测试,用它的nested_attributes来测试一个对象。
我有一个简单的设置
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:0x00000001c9bbd8> { :id => 52 }
和ap(animal_image)将返回
#<AnimalImage:0x00000005457b30> { :id => 231, :animal_id => 52 }
我需要做的是使用相同的animal_id创建4个animal_images并让我的验证失败,因为有超过3个图像..
有没有人知道如何解决这个问题?
谢谢
答案 0 :(得分: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