Заглушка Paperclip S3 запросы в спецификации - PullRequest
11 голосов
/ 09 февраля 2011

Я использую Paperclip и S3 для загрузки изображений и пытаюсь остановить вызовы S3 из моего набора тестов.Я нашел в посте Thinkbot сообщение, в котором упоминается «

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

», но это приводит к ошибке «неверное количество аргументов (4 для 2)».Я попытался переключить приведенные выше аргументы в массив, который удаляет исходную ошибку, но выдает ошибку, говорящую «Атрибут уже определен: paperclip_fixture».

Кто-нибудь смог заставить это работать?Кроме того, в идеале я хотел бы использовать локальную файловую систему для среды разработки.Есть ли простой способ сделать это?

Ответы [ 8 ]

7 голосов
/ 28 ноября 2011

Хорошо, я выяснил основную проблему.Это (я верю), как сказала Элиза, потому что я не использую 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.Вероятно, есть лучшее место для этого.

5 голосов
/ 26 января 2016

С помощью последней скрепки (из основной ветки github) и aws-sdk версии 2 я решил мою проблему с помощью следующей конфигурации:

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

Для получения дополнительной информации, пожалуйста, взгляните на amazon sdk

5 голосов
/ 01 февраля 2015

Размещение этого в моем файле 'spec / rails_helper.rb' сработало для меня:

require 'aws'
AWS.stub!
AWS.config(:access_key_id => "TESTKEY", :secret_access_key => "TESTSECRET")
3 голосов
/ 05 ноября 2013

Многие из этих методов, похоже, не работают с последними скрепками и 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, и это будетдостичь того, что вы хотите.

3 голосов
/ 03 марта 2011

Вы используете musta? Если вы не используете метод должен, то используемый вами метод paperclip_fixture может происходить откуда-то еще и, следовательно, вести себя иначе.

Потенциально актуально: https://github.com/thoughtbot/paperclip/blob/master/shoulda_macros/paperclip.rb

1 голос
/ 13 марта 2014

Я только что столкнулся с этим обновлением приложения с Rails 2.3 до Rails 3.0 после того, как прошел Тестирование Скрепки на S3 с Cucumber & Factory Girl .

Вместо включения модуля Paperclip :: Shoulda в класс Factory, мне пришлось включить его в класс FactoryGirl :: DefinitionProxy, поэтому я изменил его:

class Factory
  include Paperclip::Shoulda
end

до

class FactoryGirl::DefinitionProxy
  include Paperclip::Shoulda
end

Для справки я использую скрепку 2.4.1 и factory_girl 2.0.5.

1 голос
/ 20 февраля 2013

Вот так я заглушаю файл из скрепки без помощи помощников musta.

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

Надеюсь, это кому-нибудь поможет.

1 голос
/ 29 января 2012

Вот так у меня получилось. Сначала вы должны получить самоцвет fakeweb, иначе он потерпит неудачу. Вы также должны иметь пустой файл в пути 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: /3039850/zaglushka-paperclip-s3-zaprosy-v-spetsifikatsii
    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
...