【问题标题】:Unit testing paperclip uploads with Rspec (Rails)使用 Rspec (Rails) 对回形针上传进行单元测试
【发布时间】:2011-01-16 09:27:49
【问题描述】:

这里的总 Rspec 菜鸟。今晚写我的第一个测试。

我有一个名为 Image 的模型。我使用回形针附加了一个名为 photo 的文件。标准的东西。我已经运行了回形针生成器,并且在生产和测试模式下一切正常。

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

require File.dirname(__FILE__) + '/../spec_helper'

describe Image do

  it "should be valid" do
    Image.new.should be_valid
  end
end

此测试失败,我意识到这是因为我的模型验证(即 validates_attachment_presence)

我得到的错误是:

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 抱怨“fixture_file_upload”没有被识别……我正打算买那本 Rspec 书。我已经在网上四处搜寻答案,但似乎找不到任何东西。当我从模型中删除验证时,我的测试数据库确实填充了一些数据,所以我知道其中一些工作正常。

提前致谢,

编辑:

images.yml 看起来像这样:

one:
  name: MyString
  description: MyString

two:
  name: MyString
  description: MyString

【问题讨论】:

    标签: ruby-on-rails unit-testing rspec paperclip


    【解决方案1】:

    这应该适用于 Rails 2.X:

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

    从 Rails 3 开始,RAILS_ROOT 不再使用,您应该使用 Rails.root

    这应该适用于 Rails 3:

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

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

    【讨论】:

    • 如果模型没有“照片”字段怎么办?它应该还能工作吗?我的spec/factories.rb 中有这个:comment.pic File.new(RAILS_ROOT + '/spec/fixtures/images/rails.png') 我收到了 RSpec 错误:ActiveRecord::RecordInvalid in 'Comment should create a new instance given valid attributes'Validation failed: Pic file name image is required
    • 我猜你在模型中为 has_attached_file 放置的任何东西都会代替 :photo 所以如果你写了 has_attached_file :donkey 那么你会写 Image.new :donkey => File.new 等
    • 感谢您的回答。我在没有 root 的情况下使用它,只是相对路径 File.new('spec/fixtures/images/rails.png') 并且在我的测试中它工作得很好。
    • 如果你在 app/assets/images 中使用照片而不是 spec/fixtures/images 会怎样?我正在使用 app/assets/images 并且照片实际上被上传了,这很奇怪......它最终出现在我的公共/系统照片中,这不是我想要的。我能做什么?
    【解决方案2】:

    如果其他人通过 Google 找到了这个,RAILS_ROOT 在 Rails 3.0 中不再有效。该行应为:

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

    (注意缺少前导斜杠!)

    【讨论】:

    • 您可能在想“为什么要使用#join,因为我知道分隔符始终是斜线?” - 但是如果你使用文件连接而不是 +,你将得到一个有效的路径,无论你是否忘记并在第二个路径中的“spec”之前放置一个前导斜杠。
    【解决方案3】:

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

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

    编辑 - 可能在 Rails 3 中不起作用...

    • 查看@Paul Rosania 的回答

    【讨论】:

      【解决方案4】:

      我在集成测试中使用 multipart_body gem。 BDD 比测试更真实。

      http://steve.dynedge.co.uk/2010/09/19/multipart-body-a-gem-for-working-with-multipart-data/

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

      在 $GEM_HOME/gems/paperclip-2.3.8/README.rdoc 中,大约 76% 的路径通过了 ==Post Processing 下的文件(特别是第 147 和 148 行):

      ---[开始报价]--- 注意:由于处理器通过将原始附件转换为样式进行操作,因此如果未定义样式,则不会运行任何处理器。 ---[结束报价]---

      阅读代码,您会看到支持 :original ... 您的 has_attached_file 是否定义了样式?

      我使用通用的 ":styles => { :original => { :this_key_and => :this_value_do_not_do_anything_unless_a_lib_paperclip_processors__foo_dot_rb__does_something_with_them } }" ...只是为了让回形针从某个临时位置移动文件目录到我的 has_attached_file :路径

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多