文件上传,factory_girl& database_cleaner

时间:2012-05-31 13:26:57

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

在我的模型中,我必须选择保存在editorial_asset表格中的资产。

include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :editorial_asset do
    editorial_asset { fixture_file_upload("#{Rails.root}/spec/fixtures/files/fakeUp.png", "image/png") }
  end
end

所以我在我的模型工厂附加了:editorial_asset

的关联

上传效果很好,但需要花费太多时间(每个示例1秒)

我很想知道是否有可能在每个示例之前创建一次上传,并在工厂中说:“找到而不是创建”

但是database_cleaner的问题,除了:transaction的表之外我不能,截断需要25秒而不是40ms!

修改

需要资产的工厂

FactoryGirl.define do
  factory :actu do
    sequence(:title) {|n| "Actu #{n}"}
    sequence(:subtitle) {|n| "Sous-sitre #{n}"}

    body Lipsum.paragraphs[3]

    # Associations
    user
    # editorial_asset
  end
end

模型规范

require 'spec_helper'

describe Actu do
  before(:all) do
    @asset = create(:editorial_asset)
  end

  after(:all) do
    EditorialAsset.destroy_all
  end

  it "has a valid factory" do
    create(:actu).should be_valid
  end

end

所以工作方式是

  it "has a valid factory" do
    create(:actu, editorial_asset: @asset).should be_valid
  end

但是没有办法自动注入关联?

1 个答案:

答案 0 :(得分:1)

由于您正在使用RSpec,因此您可以使用before(:all)块来设置这些记录一次。但是,在前所有块中执行的任何操作都是 NOT 被视为事务的一部分,因此您必须在后续块中自行删除DB中的任何内容。

您的工厂对于与编辑资产有关联的模型可以,是的,尝试在创建之前先找到一个。而不是做association :editorial_asset这样的事情,你可以这样做:

editorial_asset { EditorialAsset.first || Factory.create(:editorial_asset) }

您的rspec测试可能如下所示:

before(:all) do
    @editorial = Factory.create :editorial_asset
end

after(:all) do
    EditorialAsset.destroy_all
end

it "already has an editorial asset." do
    model = Factory.create :model_with_editorial_asset
    model.editorial_asset.should == @editorial
end

在Rspec GitHub维基页面或Relish文档上阅读有关块之前和之后的更多信息:

https://github.com/rspec/rspec-rails

https://www.relishapp.com/rspec