如何使用Factory Girl生成回形针附件?
我有一个包含许多图像的模型 Person,其中图像有一个称为数据的回形针附件字段,下面显示一个缩写版本:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
Person 需要至少附加一个图像。
使用 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
注意我也尝试过上面注释掉的代码也尝试过) 大多数时候,当我运行 Cucumber 功能时,我会收到类似于以下内容的错误:
没有这样的文件或目录 - /tmp/stream,9887,0.png (Errno::ENOENT)
...
有时测试会成功运行。
谁能告诉我我在这里遇到的问题是什么,或者他们如何一起使用 FactoryGirl 和 Paperclip 来实现我想要实现的目标?
我正在使用 Rails 3。
I have model Person that has many Images, where images has a Paperclip attachment field called data, an abbreviated version displayed below:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
Person is required to have at least one Image attached to it.
When using FactoryGirl, I have code akin to the following:
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
(N.B. I have also tried the code commented out above was also tried)
Most of the time when I run cucumber features, I get an error akin to the following:
No such file or directory - /tmp/stream,9887,0.png (Errno::ENOENT)
...
Sometimes the tests run successfully.
Can anyone tell me what the problem is I am having here or how they use FactoryGirl and Paperclip together to achieve something like what I am trying to achieve?
I am using Rails 3.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
使用 fixture_file_upload
您可以在测试中
include ActionDispatch::TestProcess
helper,这里是一个示例工厂:在上面的示例中,在运行测试之前,
spec/photos/test.png
需要存在于应用程序的根目录中。请注意,
FactoryBot
是FactoryGirl
的新名称。You can use fixture_file_upload
include ActionDispatch::TestProcess
in your test helper, here is an example factory:In the above example,
spec/photos/test.png
needs to exist in your application's root directory before running your tests.Note, that
FactoryBot
is a new name forFactoryGirl
.较新的 FG 语法,不包含必要的内容
,或者更好的是,
Newer FG syntax and no includes necessary
or, better yet,
Pivotal Labs 的 Desmond Bowe 建议避免 Fixture_file_upload 由于内存泄漏问题。相反,您应该直接在工厂中设置回形针字段:
Desmond Bowe over at Pivotal Labs suggests avoiding fixture_file_upload due to memory leak problems. Instead, you should set the paperclip fields directly in your factory:
我一直在使用下面要点中的代码:
Rails 2
http://gist.github.com/162881
Rails 3
https://gist.github.com/313121
I've been using the code in the gist below:
Rails 2
http://gist.github.com/162881
Rails 3
https://gist.github.com/313121
尝试使用 ActionController::TestUploadedFile。您只需将文件属性设置为 TestUploadedFile 的实例,回形针应该负责其余的工作。例如
Try using ActionController::TestUploadedFile. You can just set the file property to an instance of TestUploadedFile and paperclip should take care of the rest. For example
在某些情况下,上述答案可能会有所帮助,并且实际上在我的一种情况下有所帮助,但是当使用 Carrierwave 时,此问题的前一个解决方案这次不起作用。
第一种方法:
对我来说,添加
after :create
解决了我的问题,如下所示:设置内联视频文件,如
video_file { File.new("#{Rails .root}/spec/fixtures/sample.mp4") }
没有成功,并且报告错误。第二种方法:
定义一个像这样的工厂(将
personal_file
更改为您的附件名称):并将这些行添加到
config/environemnts/test.rb
:The above answers in some cases can help, and the one actually helped in one of my situations, but when using a Carrierwave, the previous solution from this question didn't work out this time.
FIRST APPROACH:
For me adding an
after :create
solved the problem for me like this:Setting inline video file like
video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
didn't work out and it was reporting errors.SECOND APPROACH:
Define a factory like this (change
personal_file
to your attachment name):And add these lines to the
config/environemnts/test.rb
:你到底在测试什么?那个回形针能成功附加文件吗?这看起来确实像是回形针应该处理的测试,而不是您的应用程序。
您尝试过吗?
我们使用 Machinist 而不是factory_girl,并且刚刚使用了类似的东西。
尽管如此,我们在执行此操作时并没有真正进行太多测试,但我们通常只想拥有一个有效的
Image
对象。What are you testing exactly? That paperclip will successfully attach the file? That really seems like a test that paperclip should handle, not your application.
Have you tried
We use Machinist instead of factory_girl and have just used things like
Though, we aren't really testing much when we do this, we typically just want to have a valid
Image
object.