23

总 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
4

4 回答 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 书,太棒了。

于 2010-02-13T14:59:24.880 回答
19

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

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

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

  • 查看@Paul Rosania 的回答
于 2010-06-07T20:14:37.587 回答
5

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

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

(注意缺少前导斜线!)

于 2010-06-04T02:32:42.310 回答
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% 的路径通过了 ==Post Processing 下的文件(特别是第 147 和 148 行):

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

阅读代码,您会看到支持 :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

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

于 2011-01-12T02:39:10.787 回答