Stubbing Paperclip S3 запросы в спецификациях
Я использую Paperclip и S3 для загрузки изображений и пытаюсь отключить вызовы на S3 из своего тестового набора. Я нашел сообщение, которое упоминает, делая
a.cover { a.paperclip_fixture('album', 'cover', 'png') }
но это дает мне ошибку "неправильное количество аргументов (4 для 2)". Я попытался перевести приведенные выше аргументы в массив, который удаляет исходную ошибку, но дает сообщение об ошибке "Атрибут уже определен: paperclip_fixture".
Кто-нибудь мог получить эту работу? Кроме того, я бы идеально хотел использовать локальную файловую систему для среды разработки. Есть ли простой способ сделать это?
Ответы
Ответ 1
Вы используете shoulda? Если вы не используете shoulda метод paperclip_fixture, который вы используете, может происходить из другого места и, следовательно, вести себя по-другому.
Потенциально релевантно: https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb
Ответ 2
Хорошо, у меня есть основная проблема. Это (я считаю), как сказала Элиза, потому что я не использую 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
. Там, вероятно, лучше сказать.
Ответ 3
Размещение этого файла в моем файле spec/rails_helper.rb работало для меня:
require 'aws'
AWS.stub!
AWS.config(:access_key_id => "TESTKEY", :secret_access_key => "TESTSECRET")
Ответ 4
Многие из этих методов, похоже, не работают с последними скрепками и 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
С последней версией paperclip (из ведущей ветки github) и aws-sdk версии 2 я решил свою проблему со следующей конфигурацией:
require "aws-sdk"
Aws.config[:s3] = {stub_responses: true}
За дополнительной информацией, пожалуйста, взгляните на amazon sdk
Ответ 6
Вот как я получил эту работу. Сначала у вас должен быть камень fakeweb, иначе он потерпит неудачу. Вы также должны иметь пустой файл в пути spec/support/paperclip/[model]/[attachment_name][ext]
.
Я сделал, чтобы скопировать код из Paperclip и вставить его в мой factory. Мне не удалось заставить работать "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
Ответ 7
Вот как я заглушаю файл из скрепки без использования помощников по умолчанию.
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
Надеюсь, это поможет кому-то.
Ответ 8
Я только что наткнулся на это обновление приложения от Rails 2.3 до Rails 3.0 после того, как он выполнил Тестирование скрепки на S3 с огурцом и Factory Девушка.
Вместо включения модуля 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.