使用 Rspec (Rails) 单元测试回形针上传

问题描述 投票:0回答:4

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

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

现在我有一个名为 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
4个回答
39
投票

这应该适用于 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 书,太棒了。


19
投票

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

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

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

  • 参见@Tess Rosania 的回答

5
投票

如果其他人通过 Google 发现这一点,RAILS_ROOT 在 Rails 3.0 中不再有效。 该行应为:

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

(注意缺少前导斜杠!)


1
投票

我在集成测试中使用了 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% 的内容在==后处理下(特别是第 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 :path

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

© www.soinside.com 2019 - 2024. All rights reserved.