在我的模型中,我必须选择保存在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
但是没有办法自动注入关联?
答案 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文档上阅读有关块之前和之后的更多信息: