我正在使用Paperclip和S3进行图片上传,并试图从我的测试套件中删除对S3的调用。我找到了提到做的思想机器人帖子
a.cover { a.paperclip_fixture('album', 'cover', 'png') }
但这给了我“错误的参数数量(4个2)”错误。我尝试将上面的参数切换到一个数组,这会删除原始错误,但会出现错误,说“属性已定义:paperclip_fixture”。
有没有人能够让这个工作?另外,我最好将本地文件系统用于开发环境。有一个简单的方法吗?
答案 0 :(得分:7)
好的,我已经找到了基本问题。这是(我相信),正如伊丽莎所说,因为我没有使用shoulda
(我正在使用rspec 2.6.0
和factory_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)
具有潜在相关性: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。