1

在我的模型中,我必须选择保存在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 秒而不是 40 毫秒!

编辑

需要资产的工厂

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

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

4

1 回答 1

1

由于您使用的是 RSpec,因此您可以使用一个before(:all)块来设置这些记录一次。但是,在 before-all 块中所做的任何事情都不被视为事务的一部分,因此您必须在 after-all 块中自己从数据库中删除任何内容。

是的,您的模型工厂可以在创建它之前先尝试找到一个与编辑资产相关联的模型。而不是做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 wiki 页面或 Relish 文档中阅读有关之前和之后块的更多信息:

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

https://www.relishapp.com/rspec

于 2012-05-31T14:02:20.720 回答