如何使用工厂女工生成回形针附件?

我有一个模型人,有许多图像,其中图像有一个回形针附件字段称为数据,一个缩写版本显示如下:

class Person
has_many :images
...
end


class Image
has_attached_file :data
belongs_to :person
...
end

人必须至少有一个图像附加到它。

在使用 FactoryGirl 时,我的代码类似于以下代码:

Factory.define :image do |a|
a.data { File.new(File.join(Rails.root, 'features', 'support', 'file.png')) }
a.association :person
end


Factory.define :person do |p|
p.first_name 'Keyzer'
p.last_name 'Soze'
p.after_create do |person|
person.assets = [Factory.build(:image, :person => person)]
end
# p.images {|images| [images.association(:image)]}
end

(注意: 我也试过上面注释的代码,也试过了) 大多数情况下,当我运行黄瓜特征时,我会得到一个类似于下面这样的错误:

没有这样的文件或目录-/tmp/stream,9887,0. png (Errno: : ENOENT)

...

Sometimes the tests run successfully.

有没有人能告诉我,我在这里遇到了什么问题,或者他们是如何使用工厂女孩和回形针一起达到我想要达到的目标的?

我正在使用 Rails 3。

35238 次浏览

尝试使用 ActionController: : TestUploadedFile。您只需将 file 属性设置为 TestUploadedFile 的一个实例,其余的就交给曲别针处理了。比如说

valid_file = File.new(File.join(Rails.root, 'features', 'support', 'file.png'))
p.images {
[
ActionController::TestUploadedFile.new(valid_file, Mime::Type.new('application/png'))
]
}

你到底在测试什么?那个回形针能成功连接文件吗?这个测试应该用回形针,而不是你的申请表。

Have you tried

a.data { File.join(Rails.root, 'features', 'support', 'file.png') }

我们使用 Machinist 而不是 Factory _ girl

Image.blueprint do
image { RAILS_ROOT + 'spec/fixtures/images/001.jpg' }
end

不过,在这样做时,我们并没有进行太多的测试,我们通常只是希望有一个有效的 Image对象。

我一直在使用下面要点中的代码:

铁路2

Http://gist.github.com/162881

铁路3

Https://gist.github.com/313121

file { File.new(Rails.root.join('spec', 'fixtures', 'filename.png')) }

你可以使用 Fixture _ file _ load

在您的测试助手中的 include ActionDispatch::TestProcess,下面是一个示例工厂:

include ActionDispatch::TestProcess


FactoryBot.define do
factory :user do
avatar { fixture_file_upload(Rails.root.join('spec', 'photos', 'test.png'), 'image/png') }
end
end

在上面的示例中,在运行测试之前,spec/photos/test.png需要存在于应用程序的根目录中。

注意,FactoryBotFactoryGirl的新名称。

更新的 FG 语法,没有必要包含

factory :user do
avatar { File.new(Rails.root.join('app', 'assets', 'images', 'rails.png')) }
end

或者,更好的是,

factory :user do
avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") }
end

关键实验室的 Desmond Bowe 因为内存泄漏问题。相反,你应该直接在你的工厂设置回形针字段:

factory :attachment do
supporting_documentation_file_name { 'test.pdf' }
supporting_documentation_content_type { 'application/pdf' }
supporting_documentation_file_size { 1024 }
# ...
end

上面的答案在某些情况下会有所帮助,在我的一个情况下也确实有所帮助,但是当使用 Carrierwave 时,这个问题之前的解决方案这次没有成功。

第一种方法:

对我来说,增加一个 after :create解决了这个问题:

after :create do |b|
b.update_column(:video_file, File.join(Rails.root, 'spec', 'fixtures', 'sample.mp4'))
end

设置内联视频文件,如 video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }没有工作,它是报告错误。

第二种方法:

像这样定义一个工厂(将 personal_file更改为附件名称) :

FactoryGirl.define do
factory :contact do
personal_file { File.new("#{Rails.root}/spec/fixtures/personal_files/my_test_file.csv") }
personal_file_content_type 'text/csv'


end
end

把这些线条加到 config/environemnts/test.rb:

config.paperclip_defaults = {
url: "#{Rails.root}/spec/fixtures/:attachment/:filename",
use_timestamp: false
}