代码之家  ›  专栏  ›  技术社区  ›  stephenmurdoch

使用rspec(rails)上传的单元测试回形针

  •  22
  • stephenmurdoch  · 技术社区  · 15 年前

    这里是全部的rspec noob。今晚写我的第一个测试。

    我有一个叫图像的模型。我用回形针附上一个叫做照片的文件。标准材料。我已经运行了回形针生成器,在生产和测试模式下一切都正常。

    现在我有一个名为image.rb的规范文件,它看起来像这样(它是由Ryanb的nifty_scaffold generator创建的):

    require File.dirname(__FILE__) + '/../spec_helper'
    
    describe Image do
    
      it "should be valid" do
        Image.new.should be_valid
      end
    end
    

    这个测试失败了,我意识到这是因为我的模型验证(即验证附件存在)

    我得到的错误是:

    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 回复  |  直到 10 年前
        1
  •  39
  •   chrisdinn    14 年前

    这应该适用于Rails 2.x:

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

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

    这应该适用于Rails 3:

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

    一定要拿到RSPEC的书,太棒了。

        2
  •  19
  •   Peter Nixey Axe    10 年前

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

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

    编辑-可能不适用于Rails 3…

    • 见@paul rosania回复
        3
  •  5
  •   Paul Rosania    14 年前

    如果其他人通过Google找到这个,Rails的根目录在Rails3.0中不再有效。那行应该是:

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

    (注意缺少前导斜杠!)

        4
  •  1
  •   paul.belt    14 年前

    我在集成测试中使用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行):

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

    阅读代码,您将看到支持:原始…您的附加文件定义了样式吗?

    我使用一个通用的“:styles=>:original=>:这个”键“和=>:这个”值“不做任何事情”,除非_ 国际清算银行 _回形针处理器用点做点什么。只是让曲别针把文件从某个临时目录移到我的has-attached-file:path

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