测试。 FactoryGirl.build(:picture),picture.save和Picture.create之间存在差异

时间:2015-08-05 08:06:35

标签: ruby-on-rails rspec factory-bot

我正在尝试编写我的第一个测试,我正在使用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方法的测试传递这样做了。现场照片,因为它引用上传者可能有不同的东西...

1 个答案:

答案 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)