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

时间:2010-02-13 00:35:54

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

总Rspec noob在这里。今晚写下我的第一次考试。

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

现在我有一个名为image.rb的spec文件,它看起来像这样(它是由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

4 个答案:

答案 0 :(得分: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书,这太棒了。

答案 1 :(得分:19)

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

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

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

  • 见@Paul Rosania的回答

答案 2 :(得分:5)

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

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

(注意缺少前导斜线!)

答案 3 :(得分:1)

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

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

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

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

--- [BEGIN QUOTE] ---   注意:由于处理器通过将原始附件转换为样式来操作,因此如果没有定义样式,则不会运行处理器。 --- [结束语] ---

阅读代码,你会看到支持:原创......你的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

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