Ruby on rails 使用Rspec(Rails)对回形针上传进行单元测试
总Rspec noob在这里。今晚写我的第一个测试 我有一个叫Image的模型。我用回形针把一个叫做photo的文件贴上。标准的东西。我已经运行了回形针生成器,在生产和测试模式下一切正常 现在我有一个名为image.rb的规范文件,它看起来像这样(它是由ryanb的漂亮的脚手架生成器创建的): 这个测试失败了,我意识到这是因为我的模型验证(即验证附件的存在) 我得到的错误是:Ruby on rails 使用Rspec(Rails)对回形针上传进行单元测试,ruby-on-rails,unit-testing,rspec,paperclip,Ruby On Rails,Unit Testing,Rspec,Paperclip,总Rspec noob在这里。今晚写我的第一个测试 我有一个叫Image的模型。我用回形针把一个叫做photo的文件贴上。标准的东西。我已经运行了回形针生成器,在生产和测试模式下一切正常 现在我有一个名为image.rb的规范文件,它看起来像这样(它是由ryanb的漂亮的脚手架生成器创建的): 这个测试失败了,我意识到这是因为我的模型验证(即验证附件的存在) 我得到的错误是: Errors: Photo file name must be set., Photo file size file s
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抱怨“夹具文件上传”未被识别。。。我打算买那本Rspec的书。我在网上搜寻答案,但似乎什么也找不到。当我从模型中删除验证时,我的测试数据库中确实填充了一些数据,因此我知道其中一些工作正常
提前感谢,
编辑:
images.yml如下所示:
one:
name: MyString
description: MyString
two:
name: MyString
description: MyString
Image.new :photo => Rails.root.join("spec/fixtures/images/rails.png").open
这应该适用于Rails 2.X:
Image.new :photo => File.new(RAILS_ROOT + '/spec/fixtures/images/rails.png')
从Rails 3开始,Rails\u ROOT
不再使用,您应该使用Rails.ROOT
这应该适用于Rails 3:
Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/rails.png')
一定要拿到RSpec的书,它太棒了。如果其他人通过谷歌找到它,RAILS\u ROOT在RAILS 3.0中不再有效。该行应改为:
Image.new :photo => File.new(Rails.root + 'spec/fixtures/images/rails.png')
(注意缺少前导斜杠!)Rails.root是一个路径名对象,因此您可以这样使用它:
one:
name: MyString
description: MyString
two:
name: MyString
description: MyString
Image.new :photo => Rails.root.join("spec/fixtures/images/rails.png").open
编辑-可能在Rails 3中不起作用。。。
- 见@Paul Rosania的回答
人们可能会认为这是默认的,或者在文档中更明显。如果模型没有“照片”字段,该怎么办?它还能用吗?我的
spec/factories.rb
:comment.pic文件.new(RAILS\u ROOT+'/spec/fixtures/images/RAILS.png')中有这个
我得到了RSpec错误:ActiveRecord::RecordInvalid in'Comment应该在给定有效属性的情况下创建一个新实例'验证失败:需要Pic文件名图像
我猜你在模型中为has_attached_文件添加的任何内容都会代替:photo所以如果你写了has_attached_文件:那么您可以编写Image.new:驴=>File.new等。谢谢您的回答。我使用它时没有根目录,只是相对路径文件.new('spec/fixtures/images/rails.png'),在我的测试中效果很好。如果在app/assets/images中使用照片而不是spec/fixtures/images,会怎么样?我正在使用应用程序/资产/图像,照片实际上被上传,这很奇怪。。。它出现在我的公共/系统照片中,这不是我想要的。我能做什么?您可能会想“为什么要使用#join,因为我知道分隔符总是一个斜杠?”-但是如果您使用File join而不是+,您将获得一个有效的路径,不管您是否忘记了,并在第二条路径的“spec”之前加上一个前导斜杠。