测试。 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)