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

ste*_*och 23 unit-testing rspec ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

这个测试失败了,我意识到这是因为我的模型验证(即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
Run Code Online (Sandbox Code Playgroud)

那么如何在运行测试时告诉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
Run Code Online (Sandbox Code Playgroud)

但是rspec抱怨"fixture_file_upload"没有被识别出来......我打算拿到那本Rspec书.我已经在网上搜索了答案,但似乎找不到任何东西.当我从模型中删除验证时,我的测试数据库会填充一些数据,所以我知道其中一些工作正常.

提前致谢,

编辑:

images.yml看起来像这样:

one:
  name: MyString
  description: MyString

two:
  name: MyString
  description: MyString
Run Code Online (Sandbox Code Playgroud)

chr*_*inn 39

这应该适用于Rails 2.X:

Image.new :photo => File.new(RAILS_ROOT + '/spec/fixtures/images/rails.png')
Run Code Online (Sandbox Code Playgroud)

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

这应该适用于Rails 3:

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

肯定会得到RSpec书,这太棒了.

  • 我猜你在模型中放入了has_attached_file代替的所有内容:photo如果你写了has_attached_file:donkey然后你就写了Image.new:donkey => File.new等. (2认同)

小智 19

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

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

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

  • 请参阅@Paul Rosania的回答


Pau*_*nia 5

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

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

(注意缺少前导斜线!)

  • 你可能会想"为什么要使用#join,因为我知道分隔符总是斜杠?" - 但是如果你使用文件连接而不是+,你将得到一个有效的路径,无论你是否忘记并在第二个路径中的"spec"之前放置一个前导斜杠. (4认同)