我正在尝试编写我的第一个测试,我正在使用rspec和FactoryGirl这样做。然而,我偶然发现了一个模型验证(尽管验证是非常基本的)。我在没有FactoryGirl和FactoryGirl的情况下进行了测试:
require "rails_helper"
describe Picture do
context 'validates picture model' do
it 'fails validation if no picture is present' do
pic = Picture.create(title: "titlu", description: "Descriere", category_id: 1,
photo: nil)
expect(pic.errors[:photo].size).to eq(1)
end
end
end
这按预期工作,测试通过。我尝试使用FactoryGirl和方法.build来创建对象(否则如果对于我必须手动编写的每个对象,FactoryGirl都没有用处)。这是我的尝试:
require "rails_helper"
describe Picture do
context 'validates picture model' do
it 'fails validation if no picture is present' do
pic = FactoryGirl.build(:picture)
pic.photo = nil
pic.save
expect(pic.errors[:photo].size).to eq(1)
end
end
end
但是这个测试失败了。这是我的factories.rb文件:
FactoryGirl.define do
factory :category do |f|
f.sequence(:name) { |n| "foo#{n}" }
end
factory :picture do |f|
f.title "PozaDinFactory"
f.description "DescriereDinFactory"
f.association :category_id, factory: :category
f.photo { File.new("#{Rails.root}/spec/support/index.jpeg") }
end
factory :comment do |f|
f.text "Un comentariu din factory Girl"
f.association :picture_id, factory: :picture
f.user_id 1
end
factory :user do
email { Faker::Internet.email }
password "password"
password_confirmation "password"
end
end
两项测试有什么区别?由于第一次没有工厂通行证,而工厂通行证失败(在照片领域没有发现错误) 哦,这是我的照片模型:
class Picture < ActiveRecord::Base
belongs_to :category, counter_cache: true
has_many :comments, dependent: :destroy
mount_uploader :photo, PhotoUploader
validates_presence_of :photo
validates :title, presence: true
end
任何有关测试,代码编写等的免费提示均值得赞赏:D 附:我已经对像Title或Description这样的图片中的其他字段以及使用factorygirl和Picture.create方法的测试传递这样做了。现场照片,因为它引用上传者可能有不同的东西...
答案 0 :(得分:1)
可能是,测试因异常而失败?像没有这样的文件或目录?
如果是这样,你可以查看这个answer。它会对Paperclip文件上传进行处理,但由于fixture_file_upload
是一种rails方法,因此它也适用于其他上传。
所以你可以试试这个:
f.photo { fixture_file_upload("#{Rails.root}/spec/support/index.jpeg") }
另一件事是特质,在你的情况下,工厂女孩更清洁(有时工作更好)。
示例:
factory :picture do
title "PozaDinFactory"
description "DescriereDinFactory"
association :category_id, factory: :category
photo { File.new("#{Rails.root}/spec/support/index.jpeg") }
trait :without_photo do
photo nil
end
end
你用它来称呼它:
FactoryGirl.build(:picture, :without_photo)