测试。 FactoryGirl.build(:picture), picture.save 和 Picture.create 之间的区别
Testing. Difference betweet FactoryGirl.build(:picture), picture.save and Picture.create
我正在尝试编写我的第一个测试,我正在使用 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 来创建 object(否则 FactoryGirl 没有任何意义,如果每个 object 我都必须手写)。这是我的尝试:
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
这两个测试有什么区别?由于第一个没有factory的通过,有factory的一个失败(照片字段没有发现错误)。
O 这是我的图片模型:
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
P.S。我已经对图片中的其他字段(如标题或描述)进行了此操作,并使用 factorygirl 和 Picture.create 方法通过了测试。现场照片因为它指的是上传者可能有不同的东西......
莫非,测试失败并出现异常?没有这样的文件或目录之类的东西?
如果是这样你可以看看这个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)
我正在尝试编写我的第一个测试,我正在使用 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 来创建 object(否则 FactoryGirl 没有任何意义,如果每个 object 我都必须手写)。这是我的尝试:
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
这两个测试有什么区别?由于第一个没有factory的通过,有factory的一个失败(照片字段没有发现错误)。
O 这是我的图片模型:
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 P.S。我已经对图片中的其他字段(如标题或描述)进行了此操作,并使用 factorygirl 和 Picture.create 方法通过了测试。现场照片因为它指的是上传者可能有不同的东西......
莫非,测试失败并出现异常?没有这样的文件或目录之类的东西?
如果是这样你可以看看这个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)