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.