Ruby on rails 使用Rspec(Rails)对回形针上传进行单元测试

Ruby on rails 使用Rspec(Rails)对回形针上传进行单元测试,ruby-on-rails,unit-testing,rspec,paperclip,Ruby On Rails,Unit Testing,Rspec,Paperclip,总Rspec noob在这里。今晚写我的第一个测试 我有一个叫Image的模型。我用回形针把一个叫做photo的文件贴上。标准的东西。我已经运行了回形针生成器,在生产和测试模式下一切正常 现在我有一个名为image.rb的规范文件,它看起来像这样(它是由ryanb的漂亮的脚手架生成器创建的): 这个测试失败了,我意识到这是因为我的模型验证(即验证附件的存在) 我得到的错误是: Errors: Photo file name must be set., Photo file size file s

总Rspec noob在这里。今晚写我的第一个测试

我有一个叫Image的模型。我用回形针把一个叫做photo的文件贴上。标准的东西。我已经运行了回形针生成器,在生产和测试模式下一切正常

现在我有一个名为image.rb的规范文件,它看起来像这样(它是由ryanb的漂亮的脚手架生成器创建的):

这个测试失败了,我意识到这是因为我的模型验证(即验证附件的存在)

我得到的错误是:

Errors: Photo file name must be set., Photo file size file size must be between 0 and 1048576 bytes., Photo content type is not included in the list
那么,当rspec运行我的测试时,我如何告诉它上传照片呢

我猜这和固定装置有关。。。。也许不是。我试过和他们一起玩,但一点运气都没有。作为记录,我在fixtures文件夹中创建了一个名为images的文件夹,我想在测试中使用的两个文件分别是rails.png和grid.png)

我试着做了以下几点:

it "should be valid" do
  image = Image.new :photo => fixture_file_upload('images/rails.png', 'image/png').should be_valid 

  # I've also tried adding stuff like this
  #image.stub!(:has_attached_file).with(:photo).and_return( true )
  #image.stub!(:save_attached_files).and_return true
  #image.save.should be_true  
end
但rspec抱怨“夹具文件上传”未被识别。。。我打算买那本Rspec的书。我在网上搜寻答案,但似乎什么也找不到。当我从模型中删除验证时,我的测试数据库中确实填充了一些数据,因此我知道其中一些工作正常

提前感谢,

编辑:

images.yml如下所示:

one:
  name: MyString
  description: MyString

two:
  name: MyString
  description: MyString
Image.new :photo => Rails.root.join("spec/fixtures/images/rails.png").open

这应该适用于Rails 2.X:

Image.new :photo => File.new(RAILS_ROOT + '/spec/fixtures/images/rails.png')
从Rails 3开始,
Rails\u ROOT
不再使用,您应该使用
Rails.ROOT


这应该适用于Rails 3:

Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/rails.png')

一定要拿到RSpec的书,它太棒了。

如果其他人通过谷歌找到它,RAILS\u ROOT在RAILS 3.0中不再有效。该行应改为:

Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/rails.png')

(注意缺少前导斜杠!)

Rails.root是一个路径名对象,因此您可以这样使用它:

one:
  name: MyString
  description: MyString

two:
  name: MyString
  description: MyString
Image.new :photo => Rails.root.join("spec/fixtures/images/rails.png").open
编辑-可能在Rails 3中不起作用。。。
  • 见@Paul Rosania的回答

我在集成测试中使用多部分主体gem。与测试相比,BDD更真实一些

关于rspec和回形针,has_attached_file:photo指令创建一个虚拟属性,即:photo。。。当您为照片指定文件或路径时,回形针将接管、存储文件,并可选择对其进行处理,例如自动创建缩略图、导入电子表格等。您不会告诉rspec测试回形针。您正在调用代码并告诉rspec该代码的结果应该是什么

在$GEM_HOME/gems/paperclip-2.3.8/README.rdoc中,通过==后期处理(特别是第147行和第148行)下的文件的大约76%:

---[开始引用]--- 注意:由于处理器通过将原始附件转换为样式来运行,因此如果没有定义样式,则不会运行处理器。 ---[最后引述]---

阅读代码,您将看到支持:原始。。。您的附件是否定义了样式

我使用一个通用的“:styles=>{:original=>{:this\u key\u and=>:this\u value\u do\u not\u do\u any\u除非使用一个lib\u回形针\u processor\u foo\u dot\u rb\u用它们做某事}”。。。只是为了让回形针将文件从某个临时目录移动到我的has_attached_file:path中


人们可能会认为这是默认的,或者在文档中更明显。

如果模型没有“照片”字段,该怎么办?它还能用吗?我的
spec/factories.rb
comment.pic文件.new(RAILS\u ROOT+'/spec/fixtures/images/RAILS.png')中有这个
我得到了RSpec错误:
ActiveRecord::RecordInvalid in'Comment应该在给定有效属性的情况下创建一个新实例'验证失败:需要Pic文件名图像
我猜你在模型中为has_attached_文件添加的任何内容都会代替:photo所以如果你写了has_attached_文件:那么您可以编写Image.new:驴=>File.new等。谢谢您的回答。我使用它时没有根目录,只是相对路径文件.new('spec/fixtures/images/rails.png'),在我的测试中效果很好。如果在app/assets/images中使用照片而不是spec/fixtures/images,会怎么样?我正在使用应用程序/资产/图像,照片实际上被上传,这很奇怪。。。它出现在我的公共/系统照片中,这不是我想要的。我能做什么?您可能会想“为什么要使用#join,因为我知道分隔符总是一个斜杠?”-但是如果您使用File join而不是+,您将获得一个有效的路径,不管您是否忘记了,并在第二条路径的“spec”之前加上一个前导斜杠。