在规格中拼写Paperclip S3请求

时间:2011-02-09 05:20:18

标签: ruby-on-rails amazon-s3 paperclip stubbing

我正在使用Paperclip和S3进行图片上传,并试图从我的测试套件中删除对S3的调用。我找到了提到做的思想机器人帖子

  a.cover       { a.paperclip_fixture('album', 'cover', 'png') }

但这给了我“错误的参数数量(4个2)”错误。我尝试将上面的参数切换到一个数组,这会删除原始错误,但会出现错误,说“属性已定义:paperclip_fixture”。

有没有人能够让这个工作?另外,我最好将本地文件系统用于开发环境。有一个简单的方法吗?

8 个答案:

答案 0 :(得分:7)

好的,我已经找到了基本问题。这是(我相信),正如伊丽莎所说,因为我没有使用shoulda(我正在使用rspec 2.6.0factory_girl 2.1.2)。

这对我有用(其中Profile是具有附件的类):

  Profile.any_instance.stub(:save_attached_files).and_return(true)
  @profile = Factory(:profile)

目前我只是在before示例的rspec方法中使用了此权限。可能还有一个更好的地方。

答案 1 :(得分:5)

将它放在我的'spec / rails_helper.rb'文件中对我有用:

require 'aws'
AWS.stub!
AWS.config(:access_key_id => "TESTKEY", :secret_access_key => "TESTSECRET")

答案 2 :(得分:5)

使用最新的paperclip(来自github master分支)和aws-sdk版本2,我通过以下配置解决了我的问题:

require "aws-sdk"
Aws.config[:s3] = {stub_responses: true}

有关详细信息,请查看amazon sdk

答案 3 :(得分:3)

你正在使用shoulda吗?如果您没有使用shoulda,您正在使用的paperclip_fixture方法可能来自其他地方,因此表现不同。

具有潜在相关性:https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb

答案 4 :(得分:3)

其中许多技术似乎不适用于最新的回形针和S3。最终对我有用的是:

的组合
AWS.config(:access_key_id => "TESTKEY", :secret_access_key => "TESTSECRET", :stub_requests => true)

Mymodel.any_instance.stubs(:save_attached_files).returns(true)

但是,实际上,在许多情况下你真正需要做的就是AWS:stub_requests,它将达到你想要的效果。

答案 5 :(得分:1)

这就是我的工作方式。首先,您必须拥有fakeweb gem,否则它将失败。您还必须在spec/support/paperclip/[model]/[attachment_name][ext]路径中包含空文件。

我所做的是从Paperclip复制代码并将其粘贴到我的工厂。我无法让'paperclip_fixture'正常工作。

factory :attachment do
  file do |a|
    # Stubbed  Paperclip attachment from: https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb#L68
    # FIX: This was the only way I made this work. Calling the paperclip_fixture directly didn't work.
    # See: http://stackoverflow.com/questions/4941586/stubbing-paperclip-s3-requests-in-specs
    model, attachment, extension = "customer_attachment", "file", "doc"      
    definition = model.gsub(" ", "_").classify.constantize.
                       attachment_definitions[attachment.to_sym]

    path = "http://s3.amazonaws.com/:id/#{definition[:path]}"
    path.gsub!(/:([^\/\.]+)/) do |match|
      "([^\/\.]+)"
    end

    begin
      FakeWeb.register_uri(:put, Regexp.new(path), :body => "OK")
    rescue NameError
      raise NameError, "the stub_paperclip_s3 shoulda macro requires the fakeweb gem."
    end
    base_path = File.join(Rails.root, "spec", "support", "paperclip")
    File.new(File.join(base_path, model, "#{attachment}.#{extension}"))
  end
end

答案 6 :(得分:1)

这就是我在不使用shoulda助手的情况下从回形针存根文件的方法。

before(:each) do 
  @sheet = double('sheet')
  @sheet.stub(:url).and_return(File.join(Rails.root, 'spec','fixtures','files', 'file.xls'))
  active_record_object.stub(:sheet).and_return(@sheet)
end

希望这有助于某人。

答案 7 :(得分:1)

我在跟踪Testing Paperclip on S3 with Cucumber & Factory Girl之后,刚刚看到将应用程序从Rails 2.3升级到Rails 3.0。

我不得不将Paperclip :: Shoulda模块包含在Factory类中,而是将其包含在FactoryGirl :: DefinitionProxy类中,所以我改变了这个:

class Factory
  include Paperclip::Shoulda
end

class FactoryGirl::DefinitionProxy
  include Paperclip::Shoulda
end

作为参考,我使用了paperclip 2.4.1和factory_girl 2.0.5。